拉拉维尔 - 刀片中的模型常量


Laravel - Model const in a blade?

刀片视图中使用Model:CONST是不好的做法还是其他方法?

例如,在模型中,我有这样的:

class ServiceType extends Eloquent
{
    protected $table = 'service_type';
    const TYPE_LANDLINE = 1;
    const TYPE_SIP = 4;
}

在控制器中:

 if ($packageDb->service_type_id == ServiceType::TYPE_SIP) {
   $summary[service_type] = $packageDb->service_type_id;
 }
 if ($packageDb->service_type_id == ServiceType::TYPE_LANDLINE) {
   $summary[service_type] = $packageDb->service_type_id;
 }
 return View::make("order.order-billing")->with('summary', $summary);

在刀片中,我可以做这样的事情(未经测试):

  @if ($summary['service_type'] == ServiceType::TYPE_SIP) 
    ..
  @endif

tl;dr

这取决于你。

替代解决方案

您可以为常量创建一个变量并将其传递给视图:

$roleNames = User::ROLE_NAMES;
return View::make("membership.edit", compact('roleNames'));

然后在视图中:

 <td>@lang("app.{$roleNames[$member->pivot->role_id]}")</td>

优势

  • 较短:不必编写模型的完全限定名称。如果您有深模型结构或长模型名称,这将非常方便。
  • 您可以"重命名"常量:有时常量名称是通用的。通过传递变量,您可以为变量提供一个更具描述性的名称,该名称可以告诉您如何在给定上下文中准确使用这些常量。
  • 视图
  • 的用途更清晰:控制器的工作是提供所需的资源(用于视图)以生成对请求的响应。如果将常量传递给控制器中的视图,则可以看到视图使用哪些资源。

当然,当使用此方法很麻烦时,也可能有缺点。如果您有许多常量(例如,对于每个用户角色),那么您可能不想将它们全部传递给视图,因为您最终会得到如下所示的内容:

$noRole = User::NO_ROLE;
$memberRole = User::MEMBER_ROLE;
$adminRole = User::ADMIN_ROLE;
$moderatorRole = User::MODERATOR_ROLE;
$reviewerRole = User::REVIEWER_ROLE;
$publisherRole = User::PUBLISHER_ROLE;
return View::make("membership.edit", compact(
    'noRole',
    'memberRole',
    'adminRole',
    'moderatorRole',
    'reviewerRole',
    'publisherRole'
));

这样做的主要问题:

  • 许多不必要的代码用于微不足道的功能。
  • 难以维护,尤其是当您的视图仅使用其中的几个时。
  • 违反 DRY,特别是如果您需要在几乎所有返回视图的函数中执行此操作。

当然,您可以重构它,创建帮助程序函数,但是当(在这种情况下)直接在视图中使用常量简单易懂时,为什么要处理所有这些麻烦:

@if ($user->role === App'User::ADMIN_ROLE)

经验法则是使用更易于阅读和理解的解决方案。除非你有风格指南,否则你应该遵循它。

在刀片文件中,可以注入模型

@inject('ServiceTypeModel', 'App'Models'ServiceType')

然后使用这样的常量

{{ ServiceTypeModel::SIP }}

@if ($x < ServiceTypeModel::SIP)...