根据国外的调查,Laravel是最流行的框架,最近公司需要PHP的开发人员,但是一直招不到人,只好亲自上阵研究一下。由于以前对PHP只是大致了解,这次学习开始的时候也挺挠头的,到今天稍微入了点门,就写点心得。
    总体感觉来说,如果学过Java的Spring MVC框架,对学习mvc框架都不会有什么难度,一般来说V(view)都会采用模版,laravel采用的是blade模版,能否切换还不清楚,M(model)是模型层,常见是用ORM的方式来封装数据库,Laravel用的是Eloquent,这种模式处理单表操作非常简单,多表操作稍微麻烦一些,不清楚Eloquent的成熟情况如何,有没有达到Hibernate的水平,C(controller)就是控制器,可以理解成沟通M和C的桥梁,M和C是互相不可见的。laravel通过一个路由文件/app/routes.php来对请求进行调度,可以把请求转向php文件(View)、控制器文件(也是php文件),也可以产生直接产生输出。routes.php是个很重要的文件,需要好好研究。
    laravel的安装稍微有些麻烦,根据其主站的说明文档,可以从github.com上下载,也可以通过composer安装,composer是PHP的一个依赖管理程序,类似于java世界的Maven,从github.com下载的laravel源码没法直接使用,需要在根目录运行composer update来下载组件才能使用,所以laravel的安装对composer的依赖比较大,不过有一个好处,就是composer会对其下载的类自动生成autoload.php文件,这样在调用组件的时候,就可以直接调用类、方法,如果有名称空间的话,在类前面需要加上名称空间。
   配置好了laravel环境之后,其根目录下有以下文件目录:
   实际上laravel的目录只有4个,app、bootstrap、public、vendor,上面的conf是我后来加的apache配置用的。其中public是网站根目录,其中index.php是起始页面,vendor是组件目录,composer下载的组件都保存在这个目录下,app是laravel框架的主要文件,配置信息、路由、控制器文件都在app下,bootstrap是程序开始的时候加载的文件。composer.json是composer程序的配置文件。
   和Java不同,php文件的运行是以文件为单位的,其生命周期就是文件本身的运行周期,所以文件之间是没法共享变量的,而且php文件也无法常驻内存,如果想引用别的文件内容,需要用require "reference.php"的方法将其他文件的内容包含进来。php虽然有名称空间,但是其名称空间和Java的包不同,名称空间只具备解决命名冲突的问题,不具备文件组织的能力,所以无法根据命名空间找到相应的文件,除非找到文件,看到源码,否则你也不知道这个文件是否包含名称空间。所以对于php来说,调用php文件或php类,和文件路径没有任何关系,只要require进来,就和当前文件是平级的,可以按照名称调用。
    php的这种特性非常适合Web页面这种方式,但是不适合大规模的产品开发,尤其是不适合调用第三方组件的现象。因为第三方组件如果升级,会出现路径变化,require就需要修改路径名,如果组件较多,则require的内容就很难维护了。最好的方式是php程序能够自动加载,php的自动加载有两种实现方式:较简单容易理解的__autoload()、复杂但好用的spl_autoload_register(),具体实现方式参见http://www.jb51.net/article/23956.htm,这里说的非常详细。
   对于laravel来说,采用的是composer的自动加载机制,composer的加载机制调用起来非常简单,只要在文件中引用vendor/autoload.php就可以了,autoload.php调用vendor/composer/autoload_*.php一系列文件,这些文件都是composer自动生成的。composer的生成方式有两种:
   1)composer对于其下载的组件自动生成加载文件
   2)composer针对composer.json的属性autoload的值,加载其目录下的文件,其属性值默认如下:
"autoload": {
  "classmap": [
   "app/commands",
   "app/controllers",
   "app/models",
   "app/database/migrations",
   "app/database/seeds",
   "app/tests/TestCase.php",
  ]
 },
可以看出这些目录是在app目录下的几个子目录,包括models、controllers、commands目录,自动加载命令只能加载这下面的文件,如果建立了子目录,就需要运行命令生成自动加载文件,方法是在根目录执行composer dump-autoload或者composer dumpautoload,这两个命令似乎是一样的,具体区别目前还不知道,这个命令会产生自动加载文件。我们也可以增加自己的自动加载目录,比如增加public目录,如下
"autoload": {
  "classmap": [
   "app/commands",
   "app/controllers",
   "app/models",
   "app/database/migrations",
   "app/database/seeds",
   "app/tests/TestCase.php",
   "public"
  ]
 },
执行composer dump-autoload,就可以使用public下面的文件,可以做一个测试
<?php
//public/testC.php
class testC {
    var $name,$age;
    public function __construct($name,$age) {
        $this->name = $name;
        $this->age = $age;
    }
}
         ?>
        <?php
        //public/test.php
        require "../vendor/autoload.php";
 
$testc = new testC("石永强","199");
 
echo "name=".$testc->name.",age=".$testc->age;
       ?>
        直接执行test.php会发生错误,提示找不到testC类,运行composer update,再次运行php test.php,得到如下输出
        name=石永强,age=199
   所以,一般的开发人员不需要了解太多自动加载机制,需要记住composer下载的组件直接使用就可以了,因为自动加载了,如果是自己写的类,需要运行一下加载命令,但在开发状态下运行laravel不需要运行自动加载命令,似乎是系统后台处理了,而在生产环境中,要运行一下上述命令,并增加优化参数,即composer dump-autoload --optimize,会加快一下加载速度。
   类的自动加载基本上就差不多了,配置laravel运行非常简单,但是要注意不要将laravel 4.2配置虚拟目录,最好配置为虚拟主机,
   如果是虚拟目录,需要修改public下的.htaccess文件,增加RewriteBase语句,改后如下

<IfModule mod_rewrite.c>
<IfModule mod_negotiation.c>
Options -MultiViews
</IfModule>

RewriteEngine On

# Redirect Trailing Slashes...
#RewriteRule ^(.*)/$ /$1 [L,R=301]

# Handle Front Controller...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteBase /laravel/  #增加这一行,我的虚拟目录是/laravel
RewriteRule ^ index.php [L]
</IfModule>

Laravel学习笔记(一)的更多相关文章

  1. Laravel学习笔记(三)--在CentOS上配置Laravel

    在Laravel框架上开发了几天,不得不说,确实比较优雅,处理问题逻辑比较清楚.     今天打算在CentOS 7上配置一个Laravel,之前都是在本机上开发,打算实际配置一下.     1)系统 ...

  2. Laravel学习笔记之Session源码解析(上)

    说明:本文主要通过学习Laravel的session源码学习Laravel是如何设计session的,将自己的学习心得分享出来,希望对别人有所帮助.Laravel在web middleware中定义了 ...

  3. Laravel学习笔记之PHP反射(Reflection) (上)

    Laravel学习笔记之PHP反射(Reflection) (上) laravel php reflect 2.1k 次阅读  ·  读完需要 80 分钟 3 说明:Laravel中经常使用PHP的反 ...

  4. 慕客网laravel学习笔记

    session中set方法使用 Session::set('user.username.age','18')嵌套使用得出$user = ['username'=>['age'=>18]]; ...

  5. laravel 学习笔记 — 神奇的服务容器

     2015-05-05 14:24 来自于分类 笔记 Laravel PHP开发 竟然有人认为我是抄 Laravel 学院的,心塞.世界观已崩塌. 容器,字面上理解就是装东西的东西.常见的变量.对象属 ...

  6. Laravel学习笔记(一)安装配置开发环境

    摘要 Laravel的目标是给开发者创造一个愉快的开发过程,并且不牺牲应用的功能性.快乐的开发者才能创造最棒的代码!为了这个目的,开发者博取众框架之长处集中到Laravel中,这些框架甚至是基于Rub ...

  7. Laravel 学习笔记 —— 神奇的服务容器 [转]

    容器,字面上理解就是装东西的东西.常见的变量.对象属性等都可以算是容器.一个容器能够装什么,全部取决于你对该容器的定义.当然,有这样一种容器,它存放的不是文本.数值,而是对象.对象的描述(类.接口)或 ...

  8. Laravel学习笔记(二)

    解决了类自动加载的问题,剩下的问题就是看文档了,laravel的官方文档虽然简单,但是却包含了很多基础知识,学习Laravel最好先看看官方文档,我感觉帮助很大,因为laravel框架的源码看起来并不 ...

  9. Laravel学习笔记之Session源码解析(下)

    说明:在中篇中学习了session的CRUD增删改查操作,本篇主要学习关闭session的相关源码.实际上,在Laravel5.3中关闭session主要包括两个过程:保存当前URL到session介 ...

随机推荐

  1. javascript第四章--面向对象的程序设计

    ① 理解对象 ② 创建对象 ③ 继承

  2. 如何使用webpack优化首屏渲染时间

    其实说到性能优化,他的范围太广了,今天我们就只聊一聊通过webpack配置减少http请求数量这个点吧. 简单说下工作中遇到的问题吧,我们做的一个项目中首页用了十多张图片,每张图片都是一个静态资源,所 ...

  3. 基于vue,打印机打印暂且处理

    基于vue单页面应用.暂且没找到合适的方案,什么vue-print  .jquery.print.js.jqprint.js..canvas生成图片啊 大多不能保证页面样式保持原样. 所以,选择了最土 ...

  4. openvpn部署之快速入门实战+一键部署openvpn脚本

    个人原创禁止转载 软件环境: Centos6.9 x64 openvpn-2.4.3-1.el6.x86_64.rpm easy-rsa-2.2.2-1.el6.noarch.rpm    #推荐使用 ...

  5. tcp并发服务器(c20w)

    ** 原创文章,请勿转载 ** 并发服务器是一个老生常谈的话题,今天这里也写一个. 1. 目标: 同时在线连接20万(c20w). 开发语言:重要的事情说三遍,GOLANG, GOLANG, GOLA ...

  6. Winform 中 dataGridView 导出到Excel中的方法总结

    最近,在做CS端数据导出到Excel中时网上找了很多代码感觉都不是自己想要的,通过自己的整理归纳得到一个比较通用的方法,就给大家分享一下: 该方法需要用到两个参数(即对象),一个  DataGridV ...

  7. 杭电ACM——自我强化步骤

    第一阶段:开始入门吧!(15天,53题) http://blog.csdn.net/always2015/article/details/44966019#t0 一.输入输出练习(2天,10题) 10 ...

  8. 微服务配置内容《网上copy》=========》如何创建一个高可用的服务注册中心

    前言:首先要知道什么是一个高可用的服务注册中心,基于spring boot建成的服务注册中心是一个单节点的服务注册中心,这样一旦发生了故障,那么整个服务就会瘫痪,所以我们需要一个高可用的服务注册中心, ...

  9. C++ 指针和引用 吐血整理 Pointer&Reference

    说道C++的指针,很多人都很头疼,也很confuse.经常把它和变量名,引用(reference)等混淆,其实这最主要的原因是很多程序员对于基本知识的掌握有问题,从而导致的很多基本概念的混淆.本文就是 ...

  10. 基于 HTML5 Canvas 的 3D 模型贴图问题

    之前注意到的一个例子,但是一直没有沉下心来看这个例子到底有什么优点,总觉得就是一个 list 列表,也不知道右边的 3d 场景放两个节点是要干嘛,今天突然想起来就仔细地看了一下这个例子的代码,实际操作 ...