php - laravel 5.1 中中间件路由组和命名空间路由组之间的区别?

标签 php

我正在阅读 Laravel 5.1 文档。我不明白 laravel 路由组是如何工作的以及以下路由组之间有什么区别。

路由组和命名路由

如果您使用路由组,则可以在路由组属性数组中指定 as 关键字,允许您为组内的所有路由设置公共(public)路由名称前缀:

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

中间件

要将中间件分配给组内的所有路由,您可以使用组属性数组中的中间件键。中间件将按照您定义此数组的顺序执行:

Route::group(['middleware' => 'auth'], function () {
    Route::get('/', function ()    {
        // Uses Auth Middleware
    });

    Route::get('user/profile', function () {
        // Uses Auth Middleware
    });
});

命名空间

路由组的另一个常见用例是将相同的 PHP 命名空间分配给一组 Controller 。您可以使用组属性数组中的命名空间参数来指定组内所有 Controller 的命名空间:

 Route::group(['namespace' => 'Admin'], function()
    {
        // Controllers Within The "App\Http\Controllers\Admin" Namespace
        Route::group(['namespace' => 'User'], function()
        {
            // Controllers Within The "App\Http\Controllers\Admin\User" Namespace
        });
    });

子域路由

路由组也可用于路由通配符子域。子域可以像路由 URI 一样分配路由参数,从而允许您捕获子域的一部分以在路由或 Controller 中使用。可以使用组属性数组上的域键来指定子域:

Route::group(['domain' => '{account}.myapp.com'], function () {
    Route::get('user/{id}', function ($account, $id) {
        //
    });
});    

路由前缀

前缀组数组属性可用于为组中的每个路由添加给定 URI 的前缀。例如,您可能希望为组内的所有路由 URI 添加 admin 前缀:

Route::group(['prefix' => 'admin'], function () {
    Route::get('users', function ()    {
        // Matches The "/admin/users" URL
    });
});

您还可以使用前缀参数为分组路由指定通用参数:

Route::group(['prefix' => 'accounts/{account_id}'], function () {
    Route::get('detail', function ($account_id)    {
        // Matches The accounts/{account_id}/detail URL
    });
});

引用号:http://laravel.com/docs/5.1/routing

最佳答案

路由组允许您将共享公共(public)属性的路由分组在一起,而无需为每个路由重新定义所述属性。

示例

作为示例,让我们使用 namespace 数组属性。

假设我们有一个名为 NewsController 的 Controller ,其中包含应用新闻部分的所有管理逻辑。您可以将此文件放在“App/Http/Controllers/Admin”目录中。

Laravel 5 已关注 PSR-4 autoloading conventions ,因此应用程序期望 namespace 与文件的路径相同,因此我们的类可能如下所示:

<?php

namespace App\Http\Controllers\Admin;

class NewsController
{

}

我们可以像这样编写通往此类的路由:

Route::get('admin/news', [
    'uses' => 'Admin\NewsController@index'
]);

注意:Laravel 自动假设您的所有 Controller 都位于 App/Http/Controllers 目录中,因此我们可以将其排除在路线文件。

上面的内容应该可以正常工作,但也许您还有十几个其他类文件来处理同一命名空间中的管理逻辑。我们可以使用命名空间选项将它们分组在一起。

Route::group(['namespace' => 'Admin'], function()
{
    Route::get('admin/news', [
        'uses' => 'NewsController@index'
    ]);

    Route::get('admin/users', [
        'uses' => 'UserController@index'
    ]);

    ...
});

请注意,我不再为每个路由的 Controller 定义 Admin 命名空间。

相同的过程可以应用于中间件、子域和 URL 前缀。

进一步示例

让我们采用第一个示例并在此基础上进行构建。正如您从上面的路由声明中看到的,我们所有的管理路由都共享一个通用的 url 前缀。

http://example.com/ 管理/新闻
http://example.com/ 管理员/用户

我们可以使用 prefix 数组属性来定义路由的通用 url。在我们的例子中,这是admin

我们更新的路线声明看起来像这样。

Route::group(['namespace' => 'Admin', 'prefix' => 'admin'], function()
{
    Route::get('news', [
        'uses' => 'NewsController@index'
    ]);

    Route::get('users', [
        'uses' => 'UserController@index'
    ]);

    ...
});

您可能想知道为什么这会有用?想象一下,您已经开发了一个包含数十条甚至数百条路线的大型应用程序。然后有一天,您的老板来找您说“嘿,测试人员先生,我们需要将管理网址从 /admin 更改为 /cms,这需要多长时间? ”。

如果您已使用具有上述前缀数组属性的组声明了所有路由,那么这对您来说将是一个简单轻松的过程。

关于php - laravel 5.1 中中间件路由组和命名空间路由组之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31800781/

相关文章:

php - 避免在注册表单 php 中注入(inject) SQL

php - 优先考虑存储库中的 MySQL SELECT/LIKE 结果

php - MVC模式上的Controller和Martin Fowler描述的Page Controller模式一样吗?

php - 将 MYSQL 结果放入 PHP 数组

javascript - 为什么循环使用推移移位在 desc 数据获取中的最后一个索引处添加第一个值

php - 无法将php站点连接到mysql数据库?

php - 创建 PHP composer 包时的命名约定

PHP mysqli_query 不会执行

php - 如何通过 MySQL prepared statement 向上横向计算层级佣金

PHP扩展问题