路由
- 一次请求的完整实现过程
浏览器发出请求(发送到路由)===》路由解析该请求(根据请求找到相应的控制器)
===》控制器(controller)有两个任务
- 先和数据模型(module)交易,就是数据库取数据,映射到模型之类的。
- 再将数据或者经过逻辑处理的结果和显示层(view)交易。
基本路由
所有应用路由都定义在 App\Providers\RouteServiceProvider 类载入的 app/Http/routes.php 文件中。
如下(初始的Laravel项目中的),望代码生义啊,Route的静态方法get能接收一个URL参数(也就是’/’,根目录),还会有回调函数,回调函数返回了一个view(这种直接从路由返回view的应该不常见),就是resource下面的views下面的welcome.blade.php文件,这个文件就是测试页面的源代码页面。
Route::get('/', function () {
return view('welcome');
});
- 下面是一些有效路由
- Route::get( uri, u r i , callback);
- Route::post( uri, u r i , callback);
- Route::put( uri, u r i , callback);
- Route::patch( uri, u r i , callback);
- Route::delete( uri, u r i , callback);
- Route::options( uri, u r i , callback);
- 还能一次匹配多个路由,match可以同时匹配get和post请求,而any则可以匹配所有的请求。
Route::match(['get', 'post'], '/', function () {
//
});
Route::any('foo', function () {
//
});
路由参数
(这部分Laraver学院的文档里讲的很好,我就直接copy了)
- 必选参数
有时我们需要在路由中捕获 URI 片段。比如,要从 URL 中捕获用户 ID,需要通过如下方式定义路由参数:
Route::get('user/{id}', function ($id) {
return 'User '.$id;
});
可以按需要在路由中定义多个路由参数:(注意到了吗?回调函数function里面传的参数名称不一定要和URL中的一致,顺序对应就OK啦)
Route::get('posts/{post}/comments/{comment}', function ($postId, $commentId) {
//
});
路由参数总是通过花括号进行包裹,这些参数在路由被执行时会被传递到路由的闭包。
注意:路由参数不能包含 - 字符,需要的话可以使用 _ 替代。
- 可选参数
有时候可能需要指定可选的路由参数,这可以通过在参数名后加一个 ? 标记来实现,这种情况下需要给相应的变量指定默认值:(而且只能最后一个参数才可选)
Route::get('user/{name?}', function ($name = null) {
return $name;
});
Route::get('user/{name?}', function ($name = 'John') {
return $name;
});
- 正则约束
可以对传来的参数进行正则约束,这种功能还行吧,可能会经常用吧……使用方法很明显,就是加个where,这应该是get方法的返回对象的方法,然后用正则约束。
Route::get('user/{name}', function ($name) {
//
})->where('name', '[A-Za-z]+');
Route::get('user/{id}', function ($id) {
//
})->where('id', '[0-9]+');
Route::get('user/{id}/{name}', function ($id, $name) {
//
})->where(['id' => '[0-9]+', 'name' => '[a-z]+']);
命名路由
命名路由为生成 URL 或重定向提供了便利。实现也很简单,在定义路由时使用数组键 as
指定路由名称:
Route::get('user/profile', ['as' => 'profile', function () {
//
}]);
此外,还可以为控制器动作指定路由名称:
Route::get('user/profile', [
'as' => 'profile', 'uses' => 'UserController@showProfile'
]);
此外,除了在路由数组定义中指定路由名称外,还可以通过在路由定义之后使用 name
方法链的方式来实现:
Route::get('user/profile', 'UserController@showProfile')->name('profile');
分组路由
望码生义啊,group静态方法里面,第一个参数传一个数组,这是个关联数组,prefix属性是路由的(admin/user),namespace属性是Controller的前缀(如果不加的话就要写Admin\indexController@user)。还有个什么属性可以自己看看文档,写法就想下面这么写就行了。
Route::group(['prefix'=>'admin','namespace'=>'Admin'],function(){
Route::any('user','indexController@user');
Route::any('login','indexController@login');
});