小白巷之Laravel5新特性 - 路由和表单
帮助函数
laravel5中不仅取消了自动载入App以下多个目录(如:controller、model等),laravel5还增加了许多帮助函数:
Arrays
Paths
Routing
Strings
URLs
Miscellaneous
如上所示,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']);
//指定layout
return 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] 继续阅读