从 2015.2.4 Laravel 5.0 发布到现在已经有一个多月了(其实现在最新版本是 v5.0.16),有的朋友还在使用熟悉的 4.2 ,有的开始探索 5.0 带来的新体验。下面我主要来介绍一下这个 5.0 这个版本与之前 4.2 的差异对比,以及我个人对 Laravel 5.0 使用的一些建议和想法。
建议阅读人群:用 Laravel 4.2 写过程序,看完了 Laravel 5.0 的文档
以下标题都简单的概括了主要特点,对该部分比较熟悉的话可以跳过
更清晰的「目录结构」旧的 app/models 目录已经完全被移除,但是建议建个新的models目录 app/models 并添加命名空间。而所有的代码都放在 app 目录下,并默认使用 App 这个命名空间。不过默认的命名空间可以使用命令 php artisan app:name Artisan 来批量更改(这里的更改不仅仅是 php 文件中的 namespace ,还有一些程序中包含命名空间的字符串,请不认为通过手动修改文件的 namespace 就能完成全部的命名空间修改)。
控制器( controller ),中间件( middleware ),以及请求( requests ),现在都存放在 app/Http 的对应目录下,因为他们都与应用程序的 HTTP 传输层相关。
新的 app/Providers 目录取代了旧版 Laravel 4.x app/start 里的文件。这些服务提供者有很多启动应用程序相关的方法,像是错误处理,日志记录,路由加载,以及更多。当然,你可以自由的建立新的服务提供者到应用程序。
自定义的一些异常类可以放到 app/Exceptions 中,并在里面的 Handler.php 文件中进行捕获和处理。
自定义的一些事件的话可以放到 app/Events 中。
当然你也可以在 app 文件夹下面添加 Providers 、 Repositories 等你需要的文件夹来分类你的程序文件,从而让你的程序目录和逻辑更加清晰。
应用程序的语言文件和视图都移到 resources 目录下。还有你项目的 js 和 css 文件也建议放到这里,然后通过 Elixir 来处理并自动存储到 public 文件夹下面,供你的项目引用。
虽然繁琐但是更规范的「命名空间」命名空间这东西确实让很多PHPer「闻风丧胆」的,说的有点夸张,但是确实很多同学不知所措。在Laravel 5.0中,命名空间使用了 PSR-4 的规范,只要按照这个来,就不会有错的。并且免去了 Laravel 4.2 中你曾经一遍又一遍出错,最终发现忘记添加新的类文件后执行 composer dumpautoload 这个命令的烦恼。
model在命名空间这里专门提到 model 是有原因的。在 Laravel 4.2.2 中由于 app/ 下所有的文件都是没有命名空间也就是在全局的命名空间,所以在使用 Eloquent 的关联的时候你可能这样写 return $this->hasOne('Phone'); 。
但是在 Laravel 5.0 的时候,你需要改为 return $this->hasOne('App\Phone'); 这个样子了。
route其实 route 这里 url 对应的控制器和方法的字符串也默认是添加了命名空间的,可以在 App\Providers\RouteServiceProvider 这个文件中看到默认的命名空间为 App\Http\Controllers 。但是如果你在 app/Http/Controllers 下面新建的 controller 文件夹来分类你的 controller 的话,在写路由的时候需要添加额外处理一下。例如
Route::controllers([ 'auth' => 'Auth\AuthController', 'password' => 'Auth\PasswordController', ]);
其他地方需要注意的由于你的程序都在 App\*** 这样的命名空间下,如果你使用字符串变量作为类名的话,一定把字符串写成完整的带命名空间的类名,否则会报错找不到类的错误。例如
# Laravel 4.2中可能存在的写法 $myClassName = 'Dog'; $obj = new $myClassName(); // 在Laravel 5.0中将要报错 # L5中要修改为 $myClassName = 'app\\Models\\Dog'; $obj = new $myClassName();
性能提高的「路由」确实在 Laravel 5.0 之前对于100个以上路由的情况很尴尬,效率确实是个问题。在 Laravel 5.0 中,果断添加了缓存来提高效率,对于一些稍微大点的项目来说,收益不小。那就请记住 php artisan route:cache 这个命令。
「中间件」比过滤器更好用中间件不得不说是个好东西,用过其他语言框架的同学可能会发现这个东西的重要性。中间件能让一个请求在进入你在 route.php 中映射的 controller@method 方法之前,为你做好各种处理。例如处理 HTTP session 的读写,决定应用程序是否处于维护模式,查验跨站请求伪造(CSRF)标记,以及其他更多的功能,包括你自己想像到的在进入controller之前需要处理的一切,并可以实现跳转、报错、记录日志、处理 Request 的内容等。从而保证进入到你的 controller 的请求是如你所愿的。