PHP-Laravel-模型常量在刀片?

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

经验法则是使用易于阅读和理解的解决方案.除非您有样式指南,否则应遵循该指南.

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...