小白巷之Laravel5新特性 - 路由和表单
帮助函数
laravel5中不仅取消了自动载入App以下多个目录(如:controller、model等),laravel5还增加了许多帮助函数:
ArraysPathsRoutingStringsURLsMiscellaneous
如上所示,Routing是laravel5新增的函数,除此之外,还有view(),redirect(),bcrypt(),info(),config()等等。
Route
get('/',['as'=>'home','uses'=>'HomeController@index']);post('/login',['as'=>'auth.login','uses'=>'AuthController@postLogin']);delete('/post/{id}',['as'=>'post.destroy','uses'=>'PostController@destroy']);put('/post/{id}',['as'=>'post.update','uses'=>'PostController@update']);
View and Redirect
return view('home');//带参数传递return view('home',['title','Awesome']);//指定layoutreturn view('master',['content'=>view('index',compact('data'))]);return redirect('/home');
Hashing
$user->password = bcrypt($request->password);
Logging
info('Email sent successfully!',['context'=>'more details here']);
Configurations
echo config('app.debug');//使用默认值echo config('app.url','default');
以上函数的用法和之前的用法一样,官方推荐大家使用函数来完成,当然了,如果你不嫌麻烦的,你还是可以使用以前的View::make这种方法,但还记得我在之前的文章中提到,laravel5已经不再自动载入一些文件,所以你用到的每一个类都需要自己use一下。
路由
之前在使用laravel的时候,当项目大了,使用命令php artisan routes查看路由表,真心卡到爆,当然系统在查找路由定位的时候肯定效率也不高。laravel5为了解决这个问题使用了路由缓存,路由缓存的操作也很简单,只有两个命令:
//创建路由缓存php route:cache//清除路由缓存artisan route:clear
当然,你用laravel5开发,如果发现写了一个新的路由不起作用,不要忘了路由缓存!所以在开发中建议大家不要用,正式环境中最后是使用。
表单
Laravel5中默认取消了表单生成器,不过你还是可以通过下载vendor拓展的形式继续使用,具体我就不说了,可以google下。主要这里提醒大家一下的是,laravel5对所有的post请求都是要做csrf验证的,laravel4中使用form构造器会自动生成_token字段,laravel5里面就需要大家自己去设定了,否则的话是会报错的喔。大家来看一下代码:
-> Http/Kernel.php//该变量就是定义公共中间件,所有的请求都会经过protected $middleware = ['Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode','Illuminate\Cookie\Middleware\EncryptCookies','Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse','Illuminate\Session\Middleware\StartSession','Illuminate\View\Middleware\ShareErrorsFromSession','App\Http\Middleware\VerifyCsrfToken',];我们去看看VerifyCsrfToken文件:use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as BaseVerifier;ok,直接找到它继承的文件发现了一个函数isReading():protected function isReading($request){return in_array($request->method(), ['HEAD', 'GET', 'OPTIONS']);}大家发现了,匹配的条件里有get,没有post,所以在写表单的时候处理的时候一定不要忘记添加_token字段。
大家看到这里,肯定就郁闷了,如果每个post请求都必须做csrf验证,那么ajax类的请求怎么办呢?当然,Laravel5也给大家做好了:
//Ajax提交添加csrf<meta name="csrf-token" content="{{ csrf_token() }}" />$.ajaxSetup({headers: {'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')}});
好了,这里表单我们基本都可以建了,那么数据验证又是怎么做的呢?
Laravel5里面为了表单提交新建了一个目录,http/request下,所以我们的表单处理肯定是要在http/request下创建.
先在控制器中加入依赖代码:
public function postAdd(DemoFormRequest $request){return Response::make('添加成功');}
再来看看DemoFormRequest文件:
<?php namespace App\Http\Requests;use Illuminate\Foundation\Http\FormRequest;use Response;class DemoFormRequest extends FormRequest{//验证规则public function rules(){return ['username' => 'required','email' => 'required|email'];}//权限判断public function authorize(){// 只允许登陆用户// return \Auth::check();// 允许所有用户return true;}// 权限验证失败之后事件重写public function forbiddenResponse(){//查看Illuminate/Foundation/Http/FormRequest.php}// 数据验证失败事件重写public function response(){//查看Illuminate/Foundation/Http/FormRequest.php}}
ok,大功告成,剩下的就交给laravel自动处理了。在程序任何需要调用该form的时候,只需要使用方法注入到指定的request处理文件,权限验证和表单验证就可以自动完成了。
在Laravel4里面,所有的request处理或者是权限验证我都在是路由里面完成的,路由是对控制器的导向,而控制器是为了相应某个操作,所有的request处理如果在这里进行,那么难免在大项目中又有些过程化了。
自定义rules执行条件
laravel5还允许你自定义rules的执行条件,比如:员工自己注册的时候只需要添加用户名和密码,但手动添加用户的时候需要添加邮箱等,就可以用自定义rules执行条件来完成。
class UserFormRequest extends FormRequest{...protected $rules = ['username' => 'required','password' => 'required|min:8',];public function rules(){$rules = $this->rules;if (XX--条件--XX){$rules['email'] = 'required|email';}return $rules;}}
自定义验证器
除了一些字符串的验证,有时候还会有一些特殊的需求,比如:ip限制啊,不同用户组字符过滤等等。可以使用自定义验证器:
class DemoFormRequest extends FormRequest{public function validator(ValidationService $service){$validator = $service->getValidator($this->input());//使用after函数自定义验证$validator->after(function() use ($validator)) {// 做一些自定义验证$validator->errors()->add('field', 'new error');}}}
Laravel5的新特性系列还在继续,欢迎前往小白巷(www.xbhub.com)[http://www.xbhub.com] 继续阅读

浙公网安备 33010602011771号