• Laravel学习笔记(一)


         根据国外的调查,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>

  • 相关阅读:
    Android UI法宝的设计资源的开发
    Ural 1309 Dispute (递归)
    ZOJ3827 ACM-ICPC 2014 亚洲区域赛的比赛现场牡丹江I称号 Information Entropy 水的问题
    myeclipse如何恢复已删除的文件和代码
    在C#主线程和子线程将数据传递给对方如何实现
    SSh框架结构(Struts2.1+Hibernate4.0+Spring3.1)
    基于大数据分析的安全管理平台技术研究及应用【摘录】
    ulimit -t 引起的kill血案
    Oracle RAC 环境下的连接管理
    SMTP协议--在cmd下利用命令行发送邮件
  • 原文地址:https://www.cnblogs.com/stone-fly/p/3939398.html
Copyright © 2020-2023  润新知