在
刀片视图中使用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)...