php执行router,router.php 文件

## 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

});

});

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值