Laravel - 刀片中的模型常量?

时间:2015-06-11 10:50:19

标签: php laravel laravel-4

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

例如在模型中,我喜欢这样:

<label>

并在控制器中:

$('#address1ForLabel').replaceWith("<label for="address1" id="address1ForLabel" >" address1 "</label>")

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

class ServiceType extends Eloquent
{

    protected $table = 'service_type';

    const TYPE_LANDLINE = 1;
    const TYPE_SIP = 4;
}

2 个答案:

答案 0 :(得分:2)

TL;博士

由你决定。

替代解决方案

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

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

然后在视图中:

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

优点

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

缺点

当然,使用这种方法也很麻烦。如果你有很多常量(例如每个用户角色),那么你可能不希望将所有常量传递给视图,因为你最终会得到这样的结果:

$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)

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

答案 1 :(得分:1)

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

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

然后使用像这样的常量

{{ ServiceTypeModel::SIP }}

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