zoukankan      html  css  js  c++  java
  • Laravel中路由怎么写(二)

    1、路由命名——给路由起个名字

    1.1 基本使用

    我们使用as关键字来为路由命名:

    Route::get('/hello/Laravel',['as'=>'academy',function(){
        return 'Hello Laravel!';
    }]);

    路由命名可以让我们在使用route函数生成指向该路由的URL或者生成跳转到该路由的重定向链接时更加方便:

    Route::get('/testNamedRoute',function(){
       return route('academy');
    });

    我们在浏览器中访问http://laravel.app:8000/testNamedRoute时输出http://laravel.app:8000/hello/Laravel,然后我们修改上述闭包内代码:

    Route::get('/testNamedRoute',function(){
        return redirect()->route('academy');
    });

    再次在浏览器中访问http://laravel.app:8000/testNamedRoute时会跳转到http://laravel.app:8000/hello/Laravel

    我们甚至还可以在使用带参数的路由命名:

    Route::get('/hello/Laravel/{id}',['as'=>'academy',function($id){
        return 'Hello Laravel '.$id.'!';
    }]);

    对应的测试路由定义如下:

    Route::get('/testNamedRoute',function(){
        return redirect()->route('academy',['id'=>1]);
    });

    这样,当我们在浏览器中访问http://laravel.app:8000/testNamedRoute时会跳转到http://laravel.app:8000/hello/Laravel/1

    1.2 路由分组时路由命名方式

    再来看一个更复杂的例子,使用路由分组时如何定义路由命名?官网文档提供的例子如下:

    Route::group(['as' => 'admin::'], function () {
        Route::get('dashboard', ['as' => 'dashboard', function () {
            //
        }]);
    });

    Route门面group方法中使用一个as关键字来指定该路由群组中所有路由的公共前缀,然后再在里面每个路由中使用as关键字为该路由命名。

    这样我们可以通过如下方式来生成该路由URL:

    Route::get('/testNamedRoute',function(){
        return route('admin::dashboard');
    });

    2、路由分组

    路由分组就是将一组拥有相同属性(中间件、命名空间、子域名、路由前缀等)的路由使用Route门面的group方法聚合起来。

    2.1 中间件

    首先我们在应用根目录下运行如下Artisan命令生成一个测试用的中间件TestMiddleware

    php artisan make:middleware TestMiddleware

    这样会在/app/Http/Middleware目录下生成一个TestMiddleware.php文件,打开该文件编辑TestMiddleware类的handle方法如下:

    public function handle($request, Closure $next)
    {
        if($request->input('age')<18)
            return redirect()->route('refuse');
        return $next($request);
    }

    我们在中间件中定义这段业务逻辑的目的是年龄18岁以下的未成年人不能访问。

    然后我们打开/app/Http/Kernal.php文件,新增TestMiddlewareKernel$routeMiddleware属性:

    protected $routeMiddleware = [
        'auth' => AppHttpMiddlewareAuthenticate::class,
        'auth.basic' => IlluminateAuthMiddlewareAuthenticateWithBasicAuth::class,
        'guest' => AppHttpMiddlewareRedirectIfAuthenticated::class,
        'test' => AppHttpMiddlewareTestMiddleware::class,
    ];

    接下来我们在routes.php中定义路由如下:

    Route::group(['middleware'=>'test'],function(){
        Route::get('/write/Laravel',function(){
            //使用Test中间件
        });
        Route::get('/update/Laravel',function(){
           //使用Test中间件
        });
    });
    
    Route::get('/age/refuse',['as'=>'refuse',function(){
        return "未成年人禁止入内!";
    }]);
    

    这样当我们在浏览器中访问http://laravel.app:8000/write/Laravel?age=15或者http://laravel.app:8000/update/Laravel?age=15时就会跳转到http://laravel.app:8000/age/refuse,并显示:

    未成年人禁止入内!

    2.2 命名空间

    默认情况下,routes.php中的定义的控制器位于AppHttpControllers命名空间下,所以如果要指定命名空间,只需指定AppHttpControllers之后的部分即可:

    Route::group(['namespace' => 'Laravel'], function(){
        // 控制器在 "AppHttpControllersLaravel" 命名空间下
    
        Route::group(['namespace' => 'DOCS'], function()
        {
            // 控制器在 "AppHttpControllersLaravelDOCS" 命名空间下
        });
    });
    

    2.3 子域名

    子域名可以通过domain关键字来设置:

    Route::group(['domain'=>'{service}.laravel.app'],function(){
        Route::get('/write/Laravel',function($service){
            return "Write FROM {$service}.laravel.app";
        });
        Route::get('/update/Laravel',function($service){
            return "Update FROM {$service}.laravel.app";
        });
    });
    

    这样我们在浏览器中访问http://write.laravel.app:8000/write/Laravel,则输出

    Write FROM write.laravel.app

    访问http://update.laravel.app:8000/write/Laravel时,则输出:

    Write FROM update.laravel.app

    注意:要想让子域名解析生效,需要在hosts中绑定IP地址

    2.4 路由前缀

    如果路由群组中的所有路由包含统一前缀,则我们可以通过在group方法中设置prefix属性来指定该前缀:

    Route::group(['prefix'=>'Laravel'],function(){
        Route::get('write',function(){
            return "Write Laravel";
        });
        Route::get('update',function(){
            return "Update Laravel";
        });
    });
    

    这样我们就可以通过http://laravel.app:8000/Laravel/write或者http://laravel.app:8000/Laravel/update来访问对应的操作。

    我们甚至还可以在路由前缀中指定参数:

    Route::group(['prefix'=>'Laravel/{version}'],function(){
        Route::get('write',function($version){
            return "Write Laravel {$version}";
        });
        Route::get('update',function($version){
            return "Update Laravel {$version}";
        });
    });
    

    这样我们在浏览器中访问http://laravel.app:8000/Laravel/5.1/write,则对应会输出:

    Write Laravel 5.1
  • 相关阅读:
    GIT → 04:Git与代码托管平台
    GIT → 03:Git的下载和安装
    GIT → 02:Git和Svn比较
    GIT → 01:学习版本控制的原因
    GIT → 00:GIT学习大纲
    GIT → 10:基于IntelliJ IDEA的Git 操作
    GIT → 11:Git 工作流与实战演练
    GIT → 09:TortoiseGit 图形化工具
    亚马逊服务器搭建pptp方法
    Safari获取UDID需要安装.mobileconfig文件,
  • 原文地址:https://www.cnblogs.com/peteremperor/p/10584998.html
Copyright © 2011-2022 走看看