Laravel 5.0 发布 新版本特性详解
译注:期待Laravel5.0已经很久很久了,之前跳票说要到今年一月份发布.从一月份就一直在刷新官网和博客,始终没有更新的消息,前几天终于看到官网文档切换到了5.0版.新版本带来了众多令人激动的新特性,尤其是定时任务队列和表单请求两个特性,光看一下更新说明中的简单介绍都忍不住要上手尝试了.今天总算抽出一点时间把官方的新特性说明文档简单地翻译了一下,希望所有喜欢Laravel框架的朋友都能感受到这个版本带来的激动人心的改变.当然,如果你需要的是Phalcon那样的性能,那它肯定不是你需要的.如果你是因为虚拟主机不支持php5.4而不能享受Laravel,那你还不扔了你的虚拟主机???阿里云\腾讯云\linode...VPS的选择不要太多...
Laravel5.0
Laravel5.0引入了全新的项目目录结构.新的目录结构更有利于用Laravel来创建应用.5.0版从头到尾都采用了新的PSR-4自动加载标准.以下是5.0版主要的新特性:
目录结构
以前版本中的app/models目录被整个移除.如今你可以直接把代码放在app目录下,该目录下的所有代码默认会被组织到app命名空间.这个命名空间是可以通过新增加的Artisan命令app:name来修改的.
Controllers,middleware和requests(Laravel5.0新增加的一种类)被组织到app/Http目录,因为他们都是与你应用的HTTP传输层相关的类.与之前把所有路由过滤器放到单一的filters文件下不同,现在所有的middleware(类似之前的routefilter)被分别存放到各自自己的类文件中.
新版本中增加了一个app/Providers目录来代替之前4.x版本的app/start文件.这些serviceproviders为应用提供各种各样的引导方法,比如错误处理,日志记录,路由加载等.除此之外你当然也可以创建额外的serviceproviders.
应用的语言文件和视图被移到了resources目录.
Contracts
Laravel的所有主要组件都实现了存放在illuminate/contracts仓库中的接口.该仓库没有额外的依赖项.拥有这样一个方便的,集中存放的接口集合,你就可以很容易地通过它来对LaravelFacades进行解耦和依赖注入方面的选择和修改.
了解有关contracts的更多信息,可以查看它的完整文档.
路由缓存
如果你的应用由各种各样的控制器路由(controllerroutes)组成,你可以利用新增的Artisan命令route:cache大幅度提升路由的注册速度.这在路由数量超过100个的应用中尤其有效,可以大幅度提升整个应用在路由部分的速度.
路由中间件(RouteMiddleware)
在4.0版风格的路由"过滤器"基础上,新版5.0已经支持HTTP中间件,Laravel自带的"authentication"和"filters"已经被转换成中间件.中间件为所有类型的过滤器提供了单一接口,你可以很容易地对请求进行审查和拒绝.
了解有关中间件的更多信息,可以查看它的完整文档.
控制器方法注入
除了现有的构造器注入以外,在新版本中还可以在控制器方法中的依赖项进行类型约束.IoCcontainer会自动注入依赖项,即使在路由包含其它参数的时候也是.
publicfunctioncreatePost(Request$request,PostRepository$posts) { // }
认证脚手架
用户注册,认证以及密码重置控制器已经内置在5.0版的网站框架中,除了控制器以外,还有简单的视图,存放在resources/views/auth目录.除此之外,网站初始框架中还包含了一个"users"表的migration文件.这些简单的资源帮助开发者不用在用户认证功能上耗费大量时间.认证相关的页面可以通过auth/login和auth/register这两个路由访问.App\Services\Auth\Registrar服务负责处理创建和认证用户.
事件对象
在新版本中,你可以把事件定义成对象而不是字符串.看下面的例子:
classPodcastWasPurchased{ public$podcast; publicfunction__construct(Podcast$podcast) { $this->podcast=$podcast; } }
这个事件可以这样调用:
Event::fire(newPodcastWasPurchased($podcast));
当然,你的事件处理程序收到的也不再是一个数据列表,而是一个事件对象:
classReportPodcastPurchase{ publicfunctionhandle(PodcastWasPurchased$event) { // } }
了解有关事件的更多信息,可以查看它的完整文档.
命令/队列
在4.0版支持的任务队列基础上,5.0支持把任务队列定义为简单的命令对象.这些命令存放在app/Commands目录.下面是一个简单的命令示例:
classPurchasePodcastextendsCommandimplementsSelfHandling,ShouldBeQueued{ useSerializesModels; protected$user,$podcast; /** *创建新的命令实例 * *@returnvoid */ publicfunction__construct(User$user,Podcast$podcast) { $this->user=$user; $this->podcast=$podcast; } /** *执行命令 * *@returnvoid */ publicfunctionhandle() { //处理购买播客视频的逻辑 event(newPodcastWasPurchased($this->user,$this->podcast)); } }
Laravel的基础控制器(basecontroller)使用了新的DispatchesCommands特性,允许你很方便地监控命令的执行:
$this->dispatch(newPurchasePodcastCommand($user,$podcast));
当然,你不仅可以把命令用于任务队列(非同步执行),也可以用于同步任务.事实上,把你的应用需要执行的复杂任务封装成命令是一个很好的选择.了解有关命令的更多信息,可以查看命令桥的详细文档.
数据库队列
新版Laravel包含database队列驱动,提供简单的,本地的队列驱动,无需安装额外的包.(译注:比如让不支持事务的数据库进行类似事务的数据操作)
Laravel定时任务
在过去,为了定时执行控制台任务,开发者必须依赖Cron任务.这带来很大不便.因为定时任务并不包括在网站的源代码中,而且必须通过SSH登陆到服务器去添加Cron任务.新版Laravel的定时任务允许开发者在Laravel框架内来定义定时执行的命令,然后只需要在服务器上定义一个总的Cron任务即可.
比如:
$schedule->command('artisan:command')->dailyAt('15:00');
同样的,了解更多有关定时任务的信息,可以查阅完整文档.
Tinker/Psysh
phpartisantinker命令在新版本中借助了JustinHeleman开发的Psysh.如果你喜欢Laravel4.0里的Boris,你肯定会喜欢Psysh.Boris在Windows下运行得不好,Psysh完全支持Windows!使用方法和以前一样:
phpartisantinker
DotEnv
在Laravel5.0中,用VanceLucas实现的DotEnv替代了以前版本中的嵌套结构,容易让人困惑的环境配置目录.这个框架提供了一种非常简单的管理环境配置的方式.在Laravel5.0中检测和区分不同的运行环境变得轻而易举.了解更多详情,请访问完整的配置文档.
LaravelElixir
由JeffreyWay提供的LaravelElixir提供了简明易懂的合并,编译资源文件的接口.如果你曾经对配置Grunt或者Gulp感到很头大,那么现在你得到解放了.Elixir让你可以轻松地借助Gulp来编译你的Less,Sass和CoffeeScript文件.它甚至可以替你执行测试.
了解Elixir的更多详情,请访问完整文档.
LaravelSocialite
LaravelSocialite只兼容Laravel5.0以上版本的可选包,它提供了完整而且上手毫无难度的OAuth解决方案.目前,Socialite支持Facebook,Twitter,Google和Github.它看起来是这个样子的:
publicfunctionredirectForAuth() { returnSocialize::with('twitter')->redirect(); } publicfunctiongetUserFromProvider() { $user=Socialize::with('twitter')->user(); }
所以你不用再耗费大量的时间来编写OAuth认证流程,分分钟轻松搞定.完整文档包含有关这个可选包的全部细节.
Flysystem集成
新版Laravel还包含了强大的Flysystem文件处理静态库.通过这个库,开发者可以轻易上手,使用完全一致的API来实现本地,AmazonS3或者Rackspace进行文件存储.比如,在AmazonS3存储一个文件,可以简单到这样:
Storage::put('file.txt','contents');
了解有关LaravelFlysystem集成的更多细节,可以查看它的完整文档
表单请求
Laravel5.0带来了全新的formrequests,它扩展自Illuminate\Foundation\Http\FormRequest类.这些请求对象可以和控制器方法注入相结合,提供一种全新的验证用户输入的方法.简单举一个FormRequest的示例:
namespaceApp\Http\Requests; classRegisterRequestextendsFormRequest{ publicfunctionrules() { return[ 'email'=>'required|email|unique:users', 'password'=>'required|confirmed|min:8', ]; } publicfunctionauthorize() { returntrue; } }
定义好对应的FormRequest扩展类之后,在控制器方法中可以获得类型提示:
publicfunctionregister(RegisterRequest$request) { var_dump($request->input()); }
当Laravel的IoCcontainer识别到方法变量的类型时,它会自动注入FormRequest的实例,于是这个请求会被自动验证.这意味着当你的控制器被调用时,你可以安全地使用该请求中包含的输入数据,因为他们已经被你在表单请求类中指定的规则进行过验证了.不仅如此,如果该请求验证失败,系统还会自动重定向到你预定义好的路由,并且包含有错误提示的信息(根据需要写入session,或者转换为JSON格式.)表单验证从未如此简单过.了解有关FormRequest验证的更多细节,请查阅文档.
控制器请求简单验证
Laravel5.0的控制器基类还包含了一个ValidatesRequests的trait.该trait提供了简单的validate方法,用于验证请求.如果FormRequests对于你的应用来说太重了,那你就可以用这个轻量版的:
publicfunctioncreatePost(Request$request) { $this->validate($request,[ 'title'=>'required|max:255', 'body'=>'required', ]); }
如果验证失败,系统会抛出一个异常,对应的HTTP请求会被自动发送给浏览器.验证错误也会同时写入session.如果请求是用AJAX方式发起,Larave会自动发送一个JSON形式的验证错误信息.
了解有关FormRequest验证的更多细节,请查阅文档.
全新的生成器
为了方便生成新的默认应用结构,全新的Artisan生成命令已经被添加到框架中.你可以通过phpartisanlist查看详细命令.
配置缓存
通过config:cache命令,可以把所有的配置项写入一个缓存文件中.
SymfonyVarDumper
用于输出变量信息进行调试的辅助方法dd,在新版本中进行了升级,使用强大的SymfonyVarDumper.它可以输出带有颜色高亮和数组折叠功能的调试信息.你可以尝试一下:
dd([1,2,3]);