根据国外的调查,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. [转载] epoll详解

    转载自http://blog.csdn.net/xiajun07061225/article/details/9250579 什么是epoll epoll是什么?按照man手册的说法:是为处理大批量句 ...

  2. java 之 代理模式(大话设计模式)

    java代理模式顾名思义,就类似于大学,我想和冰可乐,可是我又在玩游戏,于是我让我的室友帮我把可乐带回来,简单的来说我的室友就是代理,而买可乐就是需要做的行为.这是笔者理解的代理模式 大话设计模式-类 ...

  3. [最短路][模版]P1346 电车

    题目描述 在一个神奇的小镇上有着一个特别的电车网络,它由一些路口和轨道组成,每个路口都连接着若干个轨道,每个轨道都通向一个路口(不排除有的观光轨道转一圈后返回路口的可能).在每个路口,都有一个开关决定 ...

  4. Shell脚本数据备份

  5. Java 操作 Json

    1. 使用Gson构建Json 初始化 JsonObject jsonObject = new JsonObject(); 添加属性 jsonObject.addProperty("name ...

  6. 2715:谁拿了最多奖学金-poj

    总时间限制:  1000ms 内存限制:  65536kB 描述 某校的惯例是在每学期的期末考试之后发放奖学金.发放的奖学金共有五种,获取的条件各自不同: 1) 院士奖学金,每人8000元,期末平均成 ...

  7. SpringMvc架构下css、js、jpg加载失败问题

    SpringMvc架构下css.js.jpg加载失败问题 springMvc搭建成功后,页面出现一些错误,jsp.js等静态资源加载失败.导致页面没有显示任何样式以及 此处原因很简单,是因为相对路径在 ...

  8. angular指令监听ng-repeat渲染完成后执行自定义事件方法

    今天工作中遇到需要用到ng-repeat遍历渲染完后执行某个操作,angular本身并没有提供监听ng-repeat渲染完成的指令,所以需要自己创建自定义指令. 在ng-repeat模板实例内部会暴露 ...

  9. Linux正则表达式语法

    基本组成部分: 正则表达式的基本组成部分. 正则表达式 描述 示例 \ 转义符,将特殊字符进行转义,忽略其特殊意义 a\.b匹配a.b,但不能匹配ajb,.被转义为特殊意义 ^ 匹配行首,awk中,^ ...

  10. 关于PHP输出字符串多了两个字节的BUG

    近日IOS开发那边小伙伴跟我说,解析服务器发回的字符信息时候出现bug. 明明利用Log输出来的是字符串"hello"  可是利用length计算就是多出来两个字节,比如这里是7. ...