zoukankan      html  css  js  c++  java
  • 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(){
        // 控制器在 "AppHttpControllersHome" 命名空间下
        Route::get('/', 'IndexController@index');
    });
    
    //后台路由组
    Route::group(['namespace' => 'Admin', 'prefix' => 'admin'], function(){
        // 控制器在 "AppHttpControllersAdmin" 命名空间下
        Route::get('/', 'AdminController@index');
    });
    
    // 或者用另外一种写法:
    Route::namespace('Admin')->prefix('admin')->group(function() {
         // AppHttpControllersAdminAdminController
         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');
    });
    
  • 相关阅读:
    CodeForces gym Nasta Rabbara lct
    bzoj 4025 二分图 lct
    CodeForces 785E Anton and Permutation
    bzoj 3669 魔法森林
    模板汇总——快读 fread
    bzoj2049 Cave 洞穴勘测 lct
    bzoj 2002 弹飞绵羊 lct裸题
    HDU 6394 Tree 分块 || lct
    HDU 6364 Ringland
    nyoj221_Tree_subsequent_traversal
  • 原文地址:https://www.cnblogs.com/AlexanderZhao/p/11254148.html
Copyright © 2011-2022 走看看