如果我在 laravel 上使用许多“get”,我该如何实现资源控制器?

Posted

技术标签:

【中文标题】如果我在 laravel 上使用许多“get”,我该如何实现资源控制器?【英文标题】:How can I implement Resource Controllers if I use many "get" on the laravel? 【发布时间】:2018-09-10 16:05:42 【问题描述】:

我有这样的路线 laravel :

Route::prefix('member')->middleware('auth')->group(function()
    Route::prefix('purchase')->group(function()
        Route::get('/', 'Member\PurchaseController@index')->name('member.purchase.index');
        Route::get('order', 'Member\PurchaseController@order')->name('member.purchase.order');
        Route::get('transaction', 'Member\PurchaseController@transaction')->name('member.purchase.transaction');
    );
);

我的控制器是这样的:

<?php
...
class PurchaseController extends Controller

    ...
    public function index()
    
        ...
    
    public function order()
    
        ...
    
    public function transaction()
    
        ...
    

我想改成 Resource Controllers(https://laravel.com/docs/5.6/controllers#resource-controllers)

所以我只使用了 1 条路线

从我的情况来看,我的路线是这样的:

Route::prefix('member')->middleware('auth')->group(function()
    Route::resource('purchase', 'Member\PurchaseController');
);

如果我使用资源控制器,我只能在 index 方法或 show 方法中数据

订单方式和交易方式如何获取数据?

【问题讨论】:

Route::resource 用于预定义索引、创建、存储、显示、编辑、更新和删除方法。如果你想使用自定义方法(就像你在这里使用的那样),你需要单独声明它们。 @Success Man 那么你认为我的情况不适合使用资源控制器吗? 自定义函数,需要定义每条路由。 【参考方案1】:

资源控制器是Laravel预定义的,只包含7个方法。

如下表所示。

所以,如果你想要任何其他方法,你必须自己定义。

php artisan route:list

您可以使用它来检查您定义的所有路线。

【讨论】:

【参考方案2】:

你可以这样试试,把你的资源控制器自定义方法放到资源路由上。

Route::prefix('member')->middleware('auth')->group(function()
    Route::get('order', 'Member\PurchaseController@order')->name('member.purchase.order');
    Route::get('transaction', 'Member\PurchaseController@transaction')->name('member.purchase.transaction')
    Route::resource('purchase', 'Member\PurchaseController');
);

【讨论】:

这是最好的方法。您可以通过将其添加到资源调用上方来覆盖任何路由资源。在所有 web.php 和 api.php 中,先到先得。 也许您想解释一下为什么会发生这种情况?在为purchase 创建资源控制器时,它将在/purchase/purchase 上定义一个带有catch all 参数的路由,这是通过标识符查看单个购买的路由。由于资源路由没有定义这是什么类型的数据,因此它将匹配/purchase/xxxx 上的每个 GET 请求,包括订单和事务(如果这些路由是在资源路由之后定义的)。 @MD Iyasin Arafat 为什么订单和交易不在团购范围内?我希望订单和交易在团购中 @Success Man,然后您只需从命名中删除“成员”,然后运行“php artisan route:list”即可查看路由组。【参考方案3】:

这里的其他答案几乎是正确的。

从我的其他答案中,您根据 MD Iyasin Arafat 的建议将这个问题链接到这里,如果您使用的是 laravel 5.5+:: p>

# Group all routes requiring middleware auth, thus declared only once

Route::middleware('auth')->group(function()

    # Suffix rules in group for prefix,namespace & name with "member"

    Route::namespace('Member')->prefix('member')->name('member.')->group(function () 

            Route::get('purchase/order', 'PurchaseController@order')->name('purchase.order');
            Route::get('purchase/transaction', 'PurchaseController@transaction')->name('purchase.transaction');
            Route::resource('purchase', 'PurchaseController');

    );

);

分组方法->group()):


控制器命名空间 (->namespace('Member'))

添加到 'PurchaseController' 以提供 'Member\PurchaseController'


路线名称 (->name('member.'))

添加到 name('purchase.order') 以提供 路线('member.purchase.order')


URI 请求 (->prefix('member'))

添加到 /purchase 以提供 example.com/member/purchase

如您所见,将上述方法与 group() 结合使用可减少前缀声明的重复。

提示

自定义路由必须始终在之前声明为资源

如果您有很多购买控制器的自定义路由以及第二个控制器如何查找成员组,则使用示例:

# Group all routes requiring middleware auth, thus declared only once

Route::middleware('auth')->group(function()

    # Suffix rules in group for prefix,namespace & name with "member"

    Route::namespace('Member')->prefix('member')->name('member.')->group(function () 

            Route::prefix('purchase')->name('purchase.')->group(function() 

                Route::get('order', 'PurchaseController@order')->name('order');

                Route::get('transaction', 'PurchaseController@transaction')->name('transaction');

                Route::get('history', 'PurchaseController@history')->name('history');

                Route::get('returns', 'PurchaseController@returns')->name('returns');

                Route::get('status', 'PurchaseController@status')->name('status');

                Route::resource('/', 'PurchaseController');

            );

            Route::prefix('account')->name('account.')->group(function() 

                Route::get('notifications', 'AccountController@notifications')->name('notifications');

                Route::resource('/', 'AccountController');

            );

    );

);

【讨论】:

为什么订单和交易不在团购范围内?我希望订单和交易在团购中 除非您要为 /purchase/* 提供大量自定义函数,否则您实际上并不需要创建另一个嵌套组,我已在我的底部添加了此类进一步嵌套的示例回答。 我修复了上面的例子,我忘了手动将嵌套的前缀与 purchase/

以上是关于如果我在 laravel 上使用许多“get”,我该如何实现资源控制器?的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 路由排序

使用 Laravel 将 jQuery Ajax POST 请求作为 GET 发送

在 Laravel 8 中使用 API 路由时返回错误

删除laravel中get中的所有数据

获取错误支持的方法:GET、HEAD Laravel

在 Laravel 路由上设置协议