Laravel 4 - Route::resource 与 Route::controller。使用哪个?

Posted

技术标签:

【中文标题】Laravel 4 - Route::resource 与 Route::controller。使用哪个?【英文标题】:Laravel 4 - Route::resource vs Route::controller. Which to use? 【发布时间】:2013-10-06 19:22:11 【问题描述】:

我了解资源控制器可以有以下方法

index
show
create
edit
store
update
destroy

现在假设除了资源操作之外,我还有以下需要执行的操作:

用户尝试登录。 管理员希望通过电子邮件/名字查找用户 用户通过它的 slug 请求一个帖子

资源控制器对上述功能无用吗?如果编写 API,我显然想要索引、显示、编辑、创建、销毁……还有登录、查找、搜索等……

是否可以路由到这两种类型的控制器?例如

Route::group(['prefix' => 'api'], function() 
    Route::group(['prefix' => 'v1'], function() 
        // Resource Controller
        Route::resource('posts', 'Api\V1\PostsResourceController');

        // Restful Controller
        Route::controller('posts', 'Api\V1\PostsController');
    );
);

或者我应该忘记资源控制器并使用 restful 控制器吗?

【问题讨论】:

只有当我有 CRUD 操作要对该逻辑执行时,我才会使用资源路由。否则我使用控制器路由。资源一为您的应用创建了许多路由,如果您不使用它们,那就是一种浪费。 @arma 您可以将这些路线列入黑名单或白名单:laravel.com/docs/4.2/controllers#restful-resource-controllers 【参考方案1】:

只需使用资源控制器,add those other methods to that same controller, and add routes to those methods directly:

Route::group(['prefix' => 'api'], function()

    Route::group(['prefix' => 'v1', 'namespace' => 'Api\V1'], function()
    
        // Add as many routes as you need...
        Route::post('login', 'PostsResourceController@login');
        Route::get('find',   'PostsResourceController@find');
        Route::get('search', 'PostsResourceController@search');

        Route::resource('posts', 'PostsResourceController');
    );
);

P.S.我通常会回避使用Route::controller()。 It's too ambiguous.

【讨论】:

谢谢你...我想我想通过想路由到控制器和资源来走捷径! 嗨,我读了文章,但不完全明白为什么它太模棱两可。你可以解释吗?为什么资源不模糊(资源创建更多路线并且不检查动作的存在)?为什么 laravel 有路由和控制器。如果它更好,为什么不只使用资源。这让未来的工匠感到困惑。谢谢 @VitalyLarchenkov - 资源创建更多路线。没有。一个资源只创建你需要的路由(如果你不需要它们,你应该指定only or except,如in the docs所述。 谢谢。 namespace 参数非常有用。 资源性能昂贵。控制器更好,更具战略性,并且允许单个路由声明。【参考方案2】:

与资源控制器相关的问题之一是当您使用命名路由时,如果使用组前缀,这一切都会变得一团糟。如果您想对前缀进行小幅更改,则必须在整个视图和控制器中进行更改。即你不能充分利用命名路线

我在开发我的 laravel 应用程序时遵循这个模型。

Route::group( [ 'prefix' => 'admin' ], function()
        Route::resource('pages', 'PageController', [
            'names' => [
                'show' => 'page',
                'edit' => 'page.edit'
            ],
            'only' => [
                'show',
                'edit'
            ]

        ]);

    );

让我有以下优势。

只有您需要的路线。 所有网址都明确命名

并且我可以使用语法轻松生成 url,即使我更改前缀或资源名称 url 也不受影响

URL::route('page', array($id))

【讨论】:

以上是关于Laravel 4 - Route::resource 与 Route::controller。使用哪个?的主要内容,如果未能解决你的问题,请参考以下文章

Laravel5.4 快速开发简书网站

从 4.1 升级到 4.2 后 Laravel 控制器路由中断

laravel5.4学习--laravel基本路由

如何将 Laravel 5.4 与 Angular 4 集成

Laravel5.4实战快速开发自媒体网站教程 Laravel实战教程

Laravel5.4实战快速开发自媒体网站教程 Laravel实战教程