laravel 学习摘要
2017-06-24 15:23:19
一. 路由的基本使用
一般我们写PHP代码,最基本的是要实现,URI->路由->控制器<->数据模型(model)
(1)首先在route.php文件(当然也可以在其他自定义路径文件)里,如下添加一个路由:
Route::get('test', function () {
return "test route";
});
- 1
- 2
- 3
- 1
- 2
- 3
(2)如果要将路由引导到控制器的话,就要这么写:
Route::get('test', 'TestController@test');
- 1
- 1
当然,你得先定义一个名为“TestController”的控制器,然后里面有成员方法“test”
好了,这就是一个基本的访问就完成了(控制器访问model这一步后面再说,这里省略),当在浏览器里输入:
http://Host/test
- 1
- 1
就可以访问到TestController->test()了;
当然,Laravel提供的基本路由方法还有很多,如:
Route::get($uri, $callback);
Route::post($uri, $callback);
Route::put($uri, $callback);
Route::patch($uri, $callback);
Route::delete($uri, $callback);
Route::options($uri, $callback);
- 1
- 2
- 3
- 4
- 5
- 6
- 1
- 2
- 3
- 4
- 5
- 6
一开始经验浅的我,也不知道put等方法有什么用,只是在看http1.1协议时有印象,现在再次查了资料后,总结如下,http1.1除了支持get/post外,还支持共8种访问方法:
HttpV1.1 8种访问方法
1. Get方法:常用的方法,略;
2. Post方法:常用的方法,略;
3. Head方法:与get方法类似,主要是为了获取某个访问的头部信息,服务器不返回请求内容;
4. PUT方法:请求往服务器上存文件;
5. DELETE方法:请求删除服务器上的文件;
6. TRACE方法:就是获取服务器收到的来自客户端的请求信息(收发调试),一般用于调试服务器;
7. Connect方法:把服务器作为跳板,让服务器代替用户去访问其它网页,之后把数据原原本本的返回给用户;
8. Options方法:获取服务器URI所支持的方法,或用于检查服务器的性能,ajax进行跨域访问时,先发送options方法来判断请求是否安全;
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
为了使用方便,laravel还允许一个路由使用多种访问方法,使用方法如下:
Route::match(['get', 'post'], 'test', function () {});
- 1
- 1
或
Route::any('test', function () {});
- 1
- 1
当然laravel也可以为路由添加条件验证, 如规定url必须带参数,如:
Route::get('posts/{post}/comments/{comment}', function ($postId, $commentId) {});
- 1
- 1
或者所带参数可以缺省,如:
Route::get('user/{id?}', function ($id="123"){});
- 1
- 1
或者所带参数满足正则表达式,如:
Route::get('user/{name}', function ($id){})->where(["name"=>"[A-Z]+"]);
- 1
- 1
或者希望所有路由中的某参数必须满足某个条件,可以在RouteServiceProvider的boot方法中添加:
public function boot()
{
Route::pattern('id', '[0-9]+');
parent::boot();
}
- 1
- 2
- 3
- 4
- 5
- 6
- 1
- 2
- 3
- 4
- 5
- 6
为了代码简洁,laravel还允许为路由定义别名:
Route::get('user/profile', 'UserController@showProfile')->name('profile');
- 1
- 1
使用时:
$url = route('profile');
$url = route('profile', ['id' => 1]);
return redirect()->route('profile');
- 1
- 2
- 3
- 1
- 2
- 3
二. 路由的群组使用
为了更好的管理路由,laravel允许使用群组的概念来描述一组路由,如:
Route::group([
'middleware' => 'auth', //使用中间件
'namespace' => 'Admin', //定义命名空间
'domain' => '{account}.myapp.com', //用于获取子域名
'prefix' => 'admin', //用于为路由前缀
'as' => 'admin::', //定义群组别名,代码调用时可使用的前缀
],
function () {
Route::get('/', function () {
// Uses Auth Middleware
});
Route::get('user/profile', function () {
// Uses Auth Middleware
});
});
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
二. 路由模型绑定
路由模型绑定是为了跨越控制层,直接通过路由来获取model的数据的,用法上又分为显式路由绑定和隐式路由绑定。
显式路由绑定如下:
Route::model('user', AppUser::class);
Route::get('profile/{user}', function (AppUser $user) {});
- 1
- 2
- 1
- 2
隐式路由绑定如下:
Route::get('api/users/{user}', function (AppUser $user){}); //区别是不用定义显式绑定model
- 1
- 1
当然,也可以用自定义方法来处理参数与model之间的关系,如:
Route::bind('user', function ($value) {
return AppUser::where('name', $value)->first();
});
- 1
- 2
- 3
- 1
- 2
- 3
三. CSRF安全
使用post,put,delete方法提交的html表单,都应该在表单里插入csrf令牌,不然就被拒绝,使用也就是两种形式,文档见:https://laravel.com/docs/5.3/csrf
在表单里将csrf-token作为键值:
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
或者在header的meta里添加csrf-token:
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}
});
- 1
- 2
- 3
- 4
- 5
- 6
- 1
- 2
- 3
- 4
- 5
- 6
四. 解决Laravel的PUT,PATCH or DELETE等路由访问和HTML不支持上述方法的矛盾:
方法如下,在表单里添加_method字段,如:
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
更简便的是,直接使用框架自带的方法:
{{ method_field('PUT') }}
发表评论: