laravel路由

路由

在laravel中,定义路由的地方在routes/web.php文件中。在使用laravel前必须先定义路由,然后才能在浏览器中访问。routes文件夹中还有一个api.php,用于定义api路径。

最简单的路由:

Route::get('/',function(){
   return 'hello,world!' ;
});

此时在浏览器中,输入localhost,就可以看到输出的字符串。

使用MVC模式时,我们一般先定义路由,然后在路由中访问控制器中的方法,控制器中的方法返回响应的视图,此时我们可以定义路由,如下:

Route::get('/','IndexController@index');

其中IndexController是控制器类,index是控制器类中的方法,index方法中可以定义返回的视图。

路由动作

上面Route::get语法只能处理get请求,laravel定义了其他请求路由的方法:

Route::post('/',function(){});
Route::put('/',function(){});
Route::delete('/',function(){});

还可以使用通用方法(不推荐使用):

Route::any('/',function(){});

我们还可以通过Route::match定义几种特定请求方法:

Route::match(['get','post'],'/',function(){});

路由参数

在laravel中还可以定义路由参数:

Route::get('post/{id}',function($id){
    return "文章ID: ".$id;
});

此时,通过localhost/post/100,就可以访问id=100的文章。还可以定义可选路由参数:

Route::get('post/{id?}',function($id=1){
    return "文章ID: ".$id;
});

如果访问localhost/post/就会返回id=1的文章

还可以为路由参数指定正则表达式,约束路由参数范围:

//id只能是数字
Route::get('page/{id}', function ($id) {
    return '页面ID: ' . $id;
})->where('id', '[0-9]+');

//name只能是大小写字母
Route::get('page/{name}', function ($name) {
    return '页面名称: ' . $name;
})->where('name', '[A-Za-z]+');

//定义多个路由参数约束规则
Route::get('page/{id}/{slug}', function ($id, $slug) {
    return $id . ':' . $slug;
})->where(['id' => '[0-9]+', 'slug' => '[A-Za-z]+']);

路由命名

为路由起名,主要是为了在控制器或者视图类中引用。路由命名示例如下:

Route::get('user/{id?}', function ($id = 1) {
    return "用户ID: " . $id;
})->name('user.profile');

此时在视图中,就可以使用命名路由:

<a href="{{ route('user.profile', ['id' => 100]) }}">
// 输出:http://blog.test/user/100

路由分组

在网络应用程序中,我们可以给路由分组,比如前后台分组,还可以根据其他特征,比如路由前缀、子域名、控制器命名空间、是否使用相同的中间件等。
定义路由分组,主要是为了让代码可读性更好,便于维护。

根据命名空间分组

//前台路由组
Route::group(['namespace' => 'Home'], function(){
    // 控制器在 "App\Http\Controllers\Home" 命名空间下
    Route::get('/', 'IndexController@index');
});

//后台路由组
Route::group(['namespace' => 'Admin', 'prefix' => 'admin'], function(){
    // 控制器在 "App\Http\Controllers\Admin" 命名空间下
    Route::get('/', 'AdminController@index');
});

// 或者用另外一种写法:
Route::namespace('Admin')->prefix('admin')->group(function() {
     // App\Http\Controllers\Admin\AdminController
     Route::get('/', 'AdminController@index');
});

此时访问 domain(你的域名)即可访问前台,domain/admin 即可访问admin后台

中间件

中间件是对请求的一种过滤或重定向功能,比如认证中间件,只有通过认证才能通过某些路由访问相应的功能。不同的路由可以通过相同的中间件进行分组:

Route::middleware('auth')->group(function () {
    Route::get('dashboard', function () {
        return view('dashboard');
    });
    Route::get('account', function () {
        return view('account');
    });
});

上面使用dashboard,account两个路由时,必须通过认证。

路由路径前缀

某些路由可以定义相同的前缀便于区分功能,可以使用Route::prefix对路由进行分组:

Route::prefix('api')->group(function () {
    Route::get('/', function () {
        // 处理 /api 路由
    })->name('api.index');
    Route::get('users', function () {
        // 处理 /api/users 路由
    })->name('api.users');
});

子域名路由

在laravel中,可以为不同的应用子系统设置不同的子域名,这时可以通过设置子域名路由访问不同的子系统:

Route::domain('test.blog.com')->group(function () {
    Route::get('/', function () {
        // 处理 http://test.blog.com 路由
    });
});

还可以通过参数方式设置子域名,适用于网站拥有多租户的场景,比如建站系统,多家公司通过定义二级域名访问自己的网站。

Route::domain('{account}.yoursite.com')->group(function () {
    Route::get('/', function ($account) {
        //
    });
    Route::get('user/{id}', function ($account, $id) {
        //
    });
});

注意:这种情况下,$account永远是所有分组路由的第一个路由参数。

路由命名前缀

除了通过上述共同特征对路由进行分组外,对于某一类资源路由,比如用户,往往拥有相同的路由命名前缀,如 user.,我们还可以基于这一特征对路由进行分组,使用 Route::name 方法即可实现:

// 路由命名+路径前缀
Route::name('user.')->prefix('user')->group(function () {
    Route::get('{id?}', function ($id = 1) {
        // 处理 /user/{id} 路由,路由命名为 user.show
        return route('user.show');
    })->name('show');
    Route::get('posts', function () {
        // 处理 /user/posts 路由,路由命名为 user.posts
    })->name('posts');
});
posted @ 2019-07-27 10:42  星空天宇  阅读(1001)  评论(0编辑  收藏  举报