多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
## router.php 1、基本路由 所有应用路由都定义在 App\Providers\RouteServiceProvider 类载入的 app/Http/routes.php 文件中。 最基本的 Laravel 路由接收一个 URI 和一个闭包: Route::get('foo', function () { return 'Hello World'; }); Route::post('foo', function () { // }); 默认情况下,routes.php 文件包含单个路由和一个路由群组,该路由群组包含的所有路由都使用了中间件组 web,而这个中间件组为路由提供了 Session 状态和 CSRF 保护功能。通常,我们会将所有路由定义在这个路由组中。 有效的路由方法 我们可以注册路由来响应任何 HTTP 请求: Route::get($uri, $callback); Route::post($uri, $callback); Route::put($uri, $callback); Route::patch($uri, $callback); Route::delete($uri, $callback); Route::options($uri, $callback); 有时候还需要注册路由响应多个 HTTP 请求——这可以通过 match 方法来实现。或者,甚至可以使用 any 方法注册一个路由来响应所有 HTTP 请求: Route::match(['get', 'post'], '/', function () { // }); Route::any('foo', function () { // }); 2、路由参数 必选参数 有时我们需要在路由中捕获 URI 片段。比如,要从 URL 中捕获用户 ID,需要通过如下方式定义路由参数: Route::get('user/{id}', function ($id) { return 'User '.$id; }); 可以按需要在路由中定义多个路由参数: 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方法来约束路由参数的格式。where方法接收参数名和一个正则表达式来定义该参数如何被约束: 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]+']); 全局约束 如果想要路由参数在全局范围内被给定正则表达式约束,可以使用pattern方法。在RouteServiceProvider类的boot方法中定义约束模式: /** * 定义路由模型绑定,模式过滤器等 * * @param \Illuminate\Routing\Router $router * @return void * */ public function boot(Router $router){ $router->pattern('id', '[0-9]+'); parent::boot($router); } 一旦模式被定义,将会自动应用到所有包含该参数名的路由中: Route::get('user/{id}', function ($id) { // 只有当 {id} 是数字时才会被调用 }); 3、命名路由 命名路由为生成 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'); 路由群组 & 命名路由 如果你在使用路由群组,可以通过在路由群组的属性数组中指定 as 关键字来为群组中的路由设置一个共用的路由名前缀: Route::group(['as' => 'admin::'], function () { Route::get('dashboard', ['as' => 'dashboard', function () { // 路由被命名为 "admin::dashboard" }]); }); 为命名路由生成URL 如果你为给定路由进行了命名,就可以通过 route 函数为该命名路由生成对应 URL: $url = route('profile'); $redirect = redirect()->route('profile'); 如果命名路由定义了参数,可以将该参数作为第二个参数传递给 route 函数。给定的路由参数将会自动插入 URL 中: Route::get('user/{id}/profile', ['as' => 'profile', function ($id) { // }]); $url = route('profile', ['id' => 1]); 4、路由群组 路由群组允许我们在多个路由中共享路由属性,比如中间件和命名空间等,这样的话我们就不必为每一个路由单独定义属性。共享属性以数组的形式作为第一个参数被传递给 Route::group 方法。 下面我们通过几个简单的应用实例来演示路由群组。 中间件 要给路由群组中定义的所有路由分配中间件,可以在群组属性数组中使用 middleware。中间件将会按照数组中定义的顺序依次执行: Route::group(['middleware' => 'auth'], function () { Route::get('/', function () { // 使用 Auth 中间件 }); Route::get('user/profile', function () { // 使用 Auth 中间件 }); }); 命名空间 另一个通用的例子是路由群组分配同一个 PHP 命名空间给其下的多个控制器,可以在分组属性数组中使用 namespace 来指定群组中所有控制器的公共命名空间: Route::group(['namespace' => 'Admin'], function(){ // 控制器在 "App\Http\Controllers\Admin" 命名空间下 Route::group(['namespace' => 'User'], function(){ // 控制器在 "App\Http\Controllers\Admin\User" 命名空间下 }); }); 默认情况下,RouteServiceProvider 引入 routes.php 并指定其下所有控制器类所在的默认命名空间 App\Http\Controllers,因此,我们在定义的时候只需要指定命名空间 App\Http\Controllers 之后的部分即可。 子域名路由 路由群组还可以被用于子域名路由通配符,子域名可以像 URI 一样被分配给路由参数,从而允许捕获子域名的部分用于路由或者控制器,子域名可以通过群组属性数组中的 domain 来指定: Route::group(['domain' => '{account}.myapp.com'], function () { Route::get('user/{id}', function ($account, $id) { // }); }); 路由前缀 群组属性 prefix 可以用来为群组中每个路由添加一个给定 URI 前缀,比如,你可以为所有路由 URI 添加 admin 前缀 : Route::group(['prefix' => 'admin'], function () { Route::get('users', function () { // 匹配 "/admin/users" URL }); }); 你还可以使用 prefix 参数为路由群组指定公共路由参数: Route::group(['prefix' => 'accounts/{account_id}'], function () { Route::get('detail', function ($account_id) { // 匹配 accounts/{account_id}/detail URL }); });