如果我在Laravel中使用多个“get”,如何实现资源控制器?

7 浏览
0 Comments

如果我在Laravel中使用多个“get”,如何实现资源控制器?

我有如下的Laravel路由:\n

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');
    });
});

\n我的控制器如下:\n


\n我想将其改为资源控制器([https://laravel.com/docs/5.6/controllers#resource-controllers](https://laravel.com/docs/5.6/controllers#resource-controllers))\n所以我只使用一个路由\n根据我的情况,我的路由应该是这样的:\n

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

\n如果我使用资源控制器,我只能在index方法或show方法中获取数据\n如何在order方法和transaction方法中获取数据?

0
0 Comments

如果在Laravel中使用了许多"get",那么如何实现资源控制器呢?这个问题的出现原因是因为在路由中有大量的重复代码,需要简化路由的声明。解决方法是使用路由分组和命名空间来减少重复代码。

在Laravel 5.5及以上版本中,可以使用以下方法来实现资源控制器:

1. 使用Route::middleware('auth')->group()将所有需要身份验证的路由分组起来,这样只需声明一次中间件。

2. 使用Route::namespace('Member')将控制器命名空间设置为"Member",这样路由会自动定位到"Member\PurchaseController"。

3. 使用Route::name('member.')为路由命名添加前缀"member.",这样可以使用route('member.purchase.order')来生成路由链接。

4. 使用Route::prefix('member')将URI请求前缀设置为"member",这样可以通过example.com/member/purchase来访问购买资源。

通过以上方法,可以减少重复的路由前缀声明,使代码更加简洁。同时,需要注意的是,自定义路由必须在资源路由之前声明。

如果有很多自定义路由需要在购买控制器中使用,可以进一步嵌套分组,如下所示:

Route::middleware('auth')->group(function(){
    Route::namespace('Member')->prefix('member')->name('member.')->group(function () {
        Route::prefix('purchase')->name('purchase.')->group(function() {
            // 自定义路由
            Route::get('order', 'PurchaseController')->name('order');
            Route::get('transaction', 'PurchaseController')->name('transaction');
            Route::get('history', 'PurchaseController')->name('history');
            Route::get('returns', 'PurchaseController')->name('returns');
            Route::get('status', 'PurchaseController')->name('status');
            // 资源路由
            Route::resource('/', 'PurchaseController');
        });
        // 其他控制器的路由
        Route::prefix('account')->name('account.')->group(function() {
            Route::get('notifications', 'AccountController')->name('notifications');
            Route::resource('/', 'AccountController');
        });
    });
});

上述代码中,自定义的路由"/purchase/order"和"/purchase/transaction"被放在了"/purchase"的分组中。这样可以根据需要进行嵌套分组,使代码更具可读性和可维护性。

,通过使用路由分组和命名空间,可以简化在Laravel中使用多个"get"的资源控制器的实现。这种方法可以减少重复的路由前缀声明,使代码更加简洁和易于维护。

0
0 Comments

问题的原因是,当使用laravel时,如果要使用多个"get"方法,如何实现资源控制器。资源控制器是由Laravel预定义的,其中包含了7个方法,如下表所示。如果要使用其他方法,需要自己定义。

解决方法是使用自定义方法来实现资源控制器。首先,可以使用"php artisan route:list"命令来查看所有已定义的路由。然后,可以在路由文件中定义自己所需的方法,例如:

Route::get('/example', 'ExampleController@customMethod');

然后,在ExampleController中定义customMethod方法来处理自定义的逻辑。通过这种方式,可以实现在资源控制器中使用多个"get"方法。

总结起来,如果在laravel中使用多个"get"方法,可以通过自定义方法来实现资源控制器。使用"php artisan route:list"命令可以查看已定义的路由,然后在路由文件中定义自己所需的方法,通过自定义方法来处理自定义的逻辑。

0
0 Comments

问题的原因是在使用laravel时,如果在resource controller上使用了多个"get"路由,可能会出现冲突。解决方法是将自定义方法放在resource路由之前。

解决方法示例代码如下:

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

这种方法是最佳实践。通过在resource路由之前添加自定义路由,可以覆盖任何路由资源。在web.php和api.php中,路由是按照先到先服务的方式处理的。

为什么会出现这个问题呢?当创建一个resource controller时,会定义一个带有catch all参数的路由:/purchase/{purchase},用于查看特定标识符的单个购买记录。由于resource路由没有定义这个数据的类型,它将匹配所有的GET请求:/purchase/xxxx,包括在resource路由之后定义的order和transaction路由。

如果想要将order和transaction路由放在purchase路由组中,可以删除命名中的'member',然后运行'php artisan route:list'命令查看路由组。

0