如何在Laravel中分离模型和视图之间的关注点?

时间:2018-10-11 23:43:03

标签: laravel coding-style laravel-blade

我正在尝试为我的简单Laravel应用程序提供干净的代码。我有一个视图(user.blade.php)用于显示用户详细信息:

<div class="name">
    <label>Name</label>
    <span class="value">{{ $user->name }}</span>
</div>
<div class="address">
    <label>Address</label>
    <span class="value">
        <span class="line1">{{ $user->address_line_1 }}</span>
        @if ($user->address_line_2 !== null)
            <span class="line2>>{{ $user->address_line_2 }}</span>
        @endif
    </span>
</div>
<div class="phone">
    <label>Phone numbers</label>
    <span class="value">
        @if ($user->phone_main !== null)
            <span class="main">{{ $user->phone_main }}</span>
        @endif
        @if ($user->phone_alt !== null)
            <span class="alt">{{ $user->phone_alt }}</span>
        @endif
    </span>
</div>

有些用户只有一个地址行,有些用户只有两个(我用两列address_line_1address_line_2进行建模,后者可以为空),有些用户有0个电话号码,另一些用户有1或2(又有两列phone_mainphone_alt,它们都可以为空)。

由于我需要正确格式化的地址行和电话号码信息,因此我使用刀片@if伪指令来确保<span>仅在它们包含任何信息时才显示。最佳实践(据我所知)规定,视图不应“做很多事情”,但我认为我无法将这种行为正确地封装在雄辩的属性({{1 }}类),因为我将元素包装在HTML标记中,并且我不希望我的模型了解HTML。

我的问题是:处理这种情况的一般准则是什么?我应该:

  1. 保留我的解决方案吗?
  2. 将显示地址和电话号码的视图部分拉成局部视图,并将其包含在此主视图中?
  3. 还有其他事吗?

1 个答案:

答案 0 :(得分:0)

我认为,在您的控制器中,您可以编写一个变量来为您创建格式化的地址。

$formattedAddress = $user->address_line_1;

if($user->address_line_2 !== null){
  $formattedAddress .= "<br>" . $user->address_line_2;
}

与电话号码相同。您可以将其返回视图:

return view ('user.details')->with("formattedAddress", $formattedAddress);

显然需要根据您的口味和要求来设置样式,但这可能对您有用。