将逻辑放置在控制器、视图和模型中

问题描述 投票:0回答:3

我正在生成一个选择菜单,其中包含单个模型中的所有行,并且我提出了 3 种不同的解决方案 - 但我很难决定哪一个最有意义并遵循 MVC / Laravel 最佳实践。

模型状态

states table:
id    abbr    name
1     AL      Alabama
2     AK      Alaska
3     AZ      Arizona
4     AR      Arkansas
etc.

解决方案#1:从控制器中的模型中检索所有状态,执行逻辑以在控制器中生成状态数组,将其传递给视图并使用带有传入数组的laraves表单类生成选择菜单。

控制器:my_controller.php

public function get_index()
{
    $states = State::all();
    foreach ($states as $state)
    {
        $states_array[$state->id] = $state->name;   
    }
        return View::make('my_view')->with('states_array',$states_array);
}

查看:my_view.php

{{ Form::select('state_id',$states_array); }}

解决方案#2:从控制器中的模型检索所有状态,将检索到的状态模型传递给视图,执行逻辑以在视图中生成状态数组,并使用 Laravels 表单类和结果数组生成选择菜单。

控制器:my_controller.php

public function get_index()
{
    $states = State::all();
    return View::make('my_view')->with('states',$states);
}

查看:my_view.php

@foreach ($states as $state)
    $states_array[$state->id] = $state->name;
@endforeach
{{ Form::select('state_id',$states_array); }}

解决方案#3: 将 all_array() (或可选地扩展 all)方法添加到状态模型,该方法提取所有状态记录,执行逻辑以创建数组并返回结果数组。在控制器中调用该方法并将其传递给视图。使用 Laravel 表单类并传入数组生成选择菜单。

模型:my_model.php

public static function all_array()
{
    $states = self::all();
    foreach ($states as $state)
    {
        $states_array[$state->id] = $state->name;   
    }
    return $states_array;
}

控制器:my_controller.php

public function get_index()
{
    $states = State::all_array();
    return View::make('my_view')->with('states',$states);
}

查看:my_view.php

{{ Form::select('state_id',$states); }}

那么这 3 个解决方案中哪一个最有意义并且更紧密地遵循 MVC / Laravel 最佳实践?可选 - 是否有比上述 3 种更好的解决方案?

php model-view-controller laravel eloquent laravel-3
3个回答
2
投票

我会选择选项一,但使用模型中的lists()方法来简化它。

$states_array = State::lists( 'name', 'id' );

这会生成您正在寻找的数组。


1
投票

我会选择解决方案#3。模型没有理由只需要以 ORM 方式运行。如果检索完整的状态列表是您需要执行的常见活动,那么请务必将其添加到您的模型类中。这样,如果您需要执行任何操作,例如排除某些状态,您可以在一个地方进行更改。


0
投票

我不会使用任何这些解决方案。您应该实现演示者模式来包装所有演示逻辑并将其置于视图之外。保持模型可能是下一个最佳方法,但理想情况下,您应该将领域逻辑与表示逻辑分开。

有一些 presenter 包,Laravel 4 甚至还有一些 presenter 包可用。

养成分离逻辑的习惯很棒,尤其是当您意识到自己在视图中执行了大量表示逻辑时。

但要明确的是,最好的方法是使用

lists()
方法,如上所述。不过还是给主持人看一下。

© www.soinside.com 2019 - 2024. All rights reserved.