在Laravel中组织控制器逻辑

时间:2016-11-27 23:31:19

标签: laravel laravel-5

假设客户可以登录到他们可以查看订单,管理付款,更改安全设置等的帐户。管理员也可以这样做,但他们的前端(即视图)将与客户不同,因为它们需要特权访问和更好的数据控制。

现在,使用RESTful design,Laravel建议按照它们代表的实体拆分路线:

// Orders
Router::get('orders', 'OrderController@index');
Router::get('orders/{order}', 'OrderController@show');
// Payments
Router::get('payments', 'PaymentController@index');
Router::get('payments/{payment}', 'PaymentController@show');
// etc.

如果我遵循这种模式,那么

  • 每个控制器方法(例如OrderController@indexPaymentController@show)将有一个if-else构造 - 一个用于处理Auth::user()时的逻辑一个客户,另一个 - 当一个管理员;这将导致代码冗余
  • 某些方法可能永远不被客户使用(例如deleteput),而管理员可能需要这些方法;这只会将混淆添加到代码

我能想到的另一种选择是拥有这样的东西:

// Customer routes
Router::get('account/orders', 'AccountController@index_orders');
Router::get('account/payments', 'AccountController@index_payments');
// Admin routes
Router::get('admin/orders', 'AdminController@index_orders');
Router::get('admin/payments', 'AdminController@index_payments');
// etc. etc.

这种方法的问题在于控制器会因各种实体的所有不同方法而变得复杂和庞大(例如OrderPayment等)。

最后,我可以想到followind 3rd选项:

// Customer routes
Router::get('orders', 'OrderController@index');
Router::get('payments', 'PaymentController@index');
// Admin routes
Router::get('a/orders', 'Admins/OrderController@index');
Router::get('a/payments', 'Admins/PaymentController@index');
// etc. etc.

/* dir structure: */
/app
    /Http
        /Controllers
              /Admins
                   OrderController.php         --  admins only 
                   PaymentController.php       --  admins only 
              OrderController.php     -- customers
              PaymentController.php   -- customers

这符合RESTful设计,并将管理员分成他们自己的路由组(在每个路由之前带有admin/前缀)。显然,问题是某些控制器逻辑将被复​​制。

处理此问题的最佳方法是什么?还有其他办法吗?谢谢!

1 个答案:

答案 0 :(得分:1)

最后一个选项是一个更好的主意。大多数结构都是优先的,但许多人会同意管理员操作的单独命名空间和路由组是个好主意。您还可以使用Route::resource(),它将为您提供REST API端点的一些默认方法(您也可以删除您不需要的方法)。它基本上与第三个选项相同,但是有一个路由组和资源控制器:

// Customer routes
Route::resource('orders', 'OrderController');
Route::resource('payments', 'PaymentController');

// Admin routes
Route::group(['prefix' => 'admin', 'namespace' => 'Admin'], function() {
    Route::resource('orders', 'OrderController');
    Route::resource('payments', 'PaymentController');
});

,您的目录结构如下所示:

app/
└── Http/
    └── Controllers/
        ├── Admin/
            ├── OrderController.php       -- Admins
            └── PaymentController.php     -- Admins
        ├── OrderController.php           -- Customers
        └── PaymentController.php         -- Customers

编辑:没有看到你已经知道资源控制器。我仍然建议这样做。