【问题标题】:As a good practice, should Laravel controllers be resource based or view based?作为一个好的实践,Laravel 控制器应该基于资源还是基于视图?
【发布时间】:2020-11-24 09:23:07
【问题描述】:

我想知道是否有关于 Laravel 控制器的良好做法。

它们应该基于资源还是基于视图?

为了更清楚,我所说的资源是指应用程序中的单个实体,例如用户、博客、评论、付款等,我所说的视图是用户看到的页面/屏幕。

此外,一个视图可以显示多个混合在一起的资源,例如,假设一个“帐户”视图将显示不同的资源,例如

  1. 所有有待支付的志愿者(志愿者资源)
  2. 最近的付款(付款资源)
  3. 最近支付的任务(任务资源)等

那么,更好的做法是为所有上述资源设置一个控制器,然后分别获取它们(任务、志愿者和付款分别),或者为“帐户”视图设置一个控制器,其中一个请求将返回所有资源需要在页面上显示的数据?

任何建议都会有所帮助!

【问题讨论】:

  • 我认为这取决于需要,通常我们使用基于资源的(特别是在 CRUD 中)。我不认为基于视图是正确的做法,因为在所有情况下它只是一个与另一个资源相关的资源。您可能需要将它们混合使用基于资源作为构建应用程序的主要方式并使用基于共享部分的视图,您可以将它们分开

标签: laravel


【解决方案1】:

实际上并没有一种“正确”的方式来构建控制器,它完全是上下文相关的。

我的经验法则是尝试遵循SOLID 原则并检查我正在构建的控制器。


在您的示例中,我可能会创建一个 AccountController 作为资源控制器并返回 Account 及其相关模型作为 show 视图的一部分:

public function show(Request $request, $id)
{
    $account = Account::with(['volunteers','payments','tasks'])->find(1);
    
    return view('accounts.show', [
        'account' => $account
    ]);
}

这是有道理的,因为 AccountController 负责返回 Account


不好

但是,这样的事情是个坏主意

public function showAccount(Request $request, $id)
{
    $account = Account::find(1);
    
    return view('accounts.show', [
        'account' => $account
    ]);
}

public function showPayments(Request $request, $id)
{
    $payments = Payment::where('account_id', $id)->get();
    
    return view('payments.show', [
        'payments' => $payments
    ]);
}

这将使AccountController 负责返回Payment,这是没有意义的。在这种情况下,我会拆分控制器并拥有PaymentController

【讨论】:

  • 我没有“帐户”的模型。如中所示,“帐户”只是用户可以查看组织的帐户相关详细信息的视图。因此,它不像一个帐户与志愿者、任务或付款相关联。让我知道这是否清楚。
  • 为什么不制作Account 模型或使用标准User 模型?拥有这些关系有很大的好处,并且可以让您访问查询范围等内容
猜你喜欢
  • 1970-01-01
  • 2020-06-19
  • 1970-01-01
  • 2013-08-28
  • 1970-01-01
  • 2011-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多