小白巷之Laravel5新特性 - 路由和表单

帮助函数

laravel5中不仅取消了自动载入App以下多个目录(如:controller、model等),laravel5还增加了许多帮助函数:

  1. Arrays
  2. Paths
  3. Routing
  4. Strings
  5. URLs
  6. Miscellaneous

如上所示,Routing是laravel5新增的函数,除此之外,还有view(),redirect(),bcrypt(),info(),config()等等。

Route

  1. get('/',['as'=>'home','uses'=>'HomeController@index']);
  2. post('/login',['as'=>'auth.login','uses'=>'AuthController@postLogin']);
  3. delete('/post/{id}',['as'=>'post.destroy','uses'=>'PostController@destroy']);
  4. put('/post/{id}',['as'=>'post.update','uses'=>'PostController@update']);

View and Redirect

  1. return view('home');
  2. //带参数传递
  3. return view('home',['title','Awesome']);
  4. //指定layout
  5. return view('master',['content'=>view('index',compact('data'))]);
  6. return redirect('/home');

Hashing

  1. $user->password = bcrypt($request->password);

Logging

  1. info('Email sent successfully!',['context'=>'more details here']);

Configurations

  1. echo config('app.debug');
  2. //使用默认值
  3. echo config('app.url','default');

以上函数的用法和之前的用法一样,官方推荐大家使用函数来完成,当然了,如果你不嫌麻烦的,你还是可以使用以前的View::make这种方法,但还记得我在之前的文章中提到,laravel5已经不再自动载入一些文件,所以你用到的每一个类都需要自己use一下。

 路由

之前在使用laravel的时候,当项目大了,使用命令php artisan routes查看路由表,真心卡到爆,当然系统在查找路由定位的时候肯定效率也不高。laravel5为了解决这个问题使用了路由缓存,路由缓存的操作也很简单,只有两个命令:

  1. //创建路由缓存
  2. php route:cache
  3. //清除路由缓存
  4. artisan route:clear

当然,你用laravel5开发,如果发现写了一个新的路由不起作用,不要忘了路由缓存!所以在开发中建议大家不要用,正式环境中最后是使用。

表单

Laravel5中默认取消了表单生成器,不过你还是可以通过下载vendor拓展的形式继续使用,具体我就不说了,可以google下。主要这里提醒大家一下的是,laravel5对所有的post请求都是要做csrf验证的,laravel4中使用form构造器会自动生成_token字段,laravel5里面就需要大家自己去设定了,否则的话是会报错的喔。大家来看一下代码:

  1. -> Http/Kernel.php
  2. //该变量就是定义公共中间件,所有的请求都会经过
  3. protected $middleware = [
  4. 'Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode',
  5. 'Illuminate\Cookie\Middleware\EncryptCookies',
  6. 'Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse',
  7. 'Illuminate\Session\Middleware\StartSession',
  8. 'Illuminate\View\Middleware\ShareErrorsFromSession',
  9. 'App\Http\Middleware\VerifyCsrfToken',
  10. ];
  11. 我们去看看VerifyCsrfToken文件:
  12. use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as BaseVerifier;
  13. ok,直接找到它继承的文件发现了一个函数isReading():
  14. protected function isReading($request)
  15.     {
  16.         return in_array($request->method(), ['HEAD', 'GET', 'OPTIONS']);
  17. }
  18. 大家发现了,匹配的条件里有get,没有post,所以在写表单的时候处理的时候一定不要忘记添加_token字段。

大家看到这里,肯定就郁闷了,如果每个post请求都必须做csrf验证,那么ajax类的请求怎么办呢?当然,Laravel5也给大家做好了:

  1. //Ajax提交添加csrf
  2. <meta name="csrf-token" content="{{ csrf_token() }}" />
  3. $.ajaxSetup({
  4.             headers: {
  5.                 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
  6. }
  7. });

好了,这里表单我们基本都可以建了,那么数据验证又是怎么做的呢?
Laravel5里面为了表单提交新建了一个目录,http/request下,所以我们的表单处理肯定是要在http/request下创建.
先在控制器中加入依赖代码:

  1. public function postAdd(DemoFormRequest $request)
  2. {
  3. return Response::make('添加成功');
  4. }

再来看看DemoFormRequest文件:

  1. <?php namespace App\Http\Requests;
  2. use Illuminate\Foundation\Http\FormRequest;
  3. use Response;
  4. class DemoFormRequest extends FormRequest
  5. {
  6. //验证规则
  7. public function rules()
  8. {
  9. return [
  10. 'username' => 'required',
  11. 'email' => 'required|email'
  12. ];
  13. }
  14. //权限判断
  15. public function authorize()
  16. {
  17. // 只允许登陆用户
  18. // return \Auth::check();
  19. // 允许所有用户
  20. return true;
  21. }
  22. // 权限验证失败之后事件重写
  23. public function forbiddenResponse()
  24. {
  25. //查看Illuminate/Foundation/Http/FormRequest.php
  26. }
  27. // 数据验证失败事件重写
  28. public function response()
  29. {
  30. //查看Illuminate/Foundation/Http/FormRequest.php
  31. }
  32. }

ok,大功告成,剩下的就交给laravel自动处理了。在程序任何需要调用该form的时候,只需要使用方法注入到指定的request处理文件,权限验证和表单验证就可以自动完成了。

在Laravel4里面,所有的request处理或者是权限验证我都在是路由里面完成的,路由是对控制器的导向,而控制器是为了相应某个操作,所有的request处理如果在这里进行,那么难免在大项目中又有些过程化了。

自定义rules执行条件

laravel5还允许你自定义rules的执行条件,比如:员工自己注册的时候只需要添加用户名和密码,但手动添加用户的时候需要添加邮箱等,就可以用自定义rules执行条件来完成。

  1. class UserFormRequest extends FormRequest
  2. {
  3. ...
  4. protected $rules = [
  5. 'username' => 'required',
  6. 'password' => 'required|min:8',
  7. ];
  8. public function rules()
  9. {
  10. $rules = $this->rules;
  11. if (XX--条件--XX)
  12. {
  13. $rules['email'] = 'required|email';
  14. }
  15. return $rules;
  16. }
  17. }

自定义验证器

除了一些字符串的验证,有时候还会有一些特殊的需求,比如:ip限制啊,不同用户组字符过滤等等。可以使用自定义验证器:

  1. class DemoFormRequest extends FormRequest
  2. {
  3. public function validator(ValidationService $service)
  4.         {
  5.             $validator = $service->getValidator($this->input());
  6. //使用after函数自定义验证
  7. $validator->after(function() use ($validator)) {
  8. // 做一些自定义验证
  9. $validator->errors()->add('field', 'new error');
  10. }
  11. }
  12. }

Laravel5的新特性系列还在继续,欢迎前往小白巷(www.xbhub.com)[http://www.xbhub.com] 继续阅读





posted @ 2015-04-18 16:24  jroy  阅读(671)  评论(0编辑  收藏  举报