【问题标题】:Common practice to get class name in View template在视图模板中获取类名的常见做法
【发布时间】:2015-04-25 06:13:29
【问题描述】:

假设我将一个可以包含两个不同类的实例的数组传递给包含表格标记的 View 模板。每个项目都将显示为表格行,因此我需要检查它的类名以包含适当的行部分。 到目前为止,我只能看到两种方法来实现这一目标:

  • 使用get_class函数比较类名
  • 在两个类中添加isFoo()方法,如果对象的类是Foo,则返回true

我不喜欢第二个选项,因为在我有两个以上的类的情况下更难维护,但我想知道第一个选项是否常用,get_class 函数是否适合放置在视图模板中。

laravel 的刀片模板中的示例:

/* catalog.cycle_rows.blade.php */
@foreach($cycles as $cycle)
@include('catalog.cycle_row')
@if( $cycle->subcycles )
    @include('catalog.cycle_rows', ['cycles' => $cycle->subcycles])
@else
    @foreach($cycle->cycleItems as $cycleItem) 
        @if($cycleItem->isBlock()) // here's the check
            @include('catalog.block_row', ['cycle' => $cycleItem])
        @else
            @include('catalog.cycle_item_row')
        @endif
    @endforeach
@endif
@endforeach

【问题讨论】:

  • 我不确定检查类名是否是解决此问题的最佳方法。我真的不知道您的应用程序是如何工作的,但我可能会使用像您的选项 2 这样的实例变量或方法。

标签: php laravel blade


【解决方案1】:

我不会做任何建议的选项并使用instanceof

@if($cycleItem instanceof Block)
    @include('catalog.block_row', ['cycle' => $cycleItem])
@else
    @include('catalog.cycle_item_row')
@endif

【讨论】:

  • 我不确定是否应该将instanceofget_class() 放入模板中。我在那里找到了相同观点的答案:stackoverflow.com/questions/10113442/…
  • 嗯,是的,这应该可以避免。但如果你不能/或不想避免它,我会使用 instanceof 而不是 get_class()...
【解决方案2】:

我会使用view presenter。这将允许您将“模型到视图”逻辑包装在专门用于此功能的单独层中。

【讨论】:

  • 据我所知,视图展示器用于装饰属性或模仿拥有一个属性。我不确定它是否能解决这个问题,但无论如何谢谢。
  • 视图展示器旨在在模型和视图之间的层上添加视图特定的逻辑。您不想在模板中使用复杂的 PHP 条件,也不想在模型中使用它们,因为它不是您的域代码的一部分。剩下的就是控制器,无论如何你都希望保持最小化。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-21
  • 2012-12-28
  • 2010-10-06
  • 2013-06-16
  • 1970-01-01
  • 1970-01-01
  • 2010-11-06
相关资源
最近更新 更多