【问题标题】:Placing logic inside controller vs view vs model将逻辑放在控制器、视图和模型中
【发布时间】:2013-04-17 17:50:56
【问题描述】:

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

模型状态

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

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

*控制器: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: 从控制器中的模型中检索所有状态,将检索到的状态模型传递给视图,执行逻辑以在视图中生成状态数组,并使用带有结果数组的 laravel 表单类生成选择菜单。

*控制器: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()(或可选地全部扩展)方法,该方法会拉取所有状态记录,执行逻辑以创建数组并返回结果数组。在控制器中调用所述方法并将其传递给视图。使用传入数组的 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 种更好的解决方案?

非常感谢任何和所有的回复!

【问题讨论】:

  • 一般来说,我把模型分成不同的部分。其中之一是逻辑部分。其他包括验证、数据库查询和任何其他需要的因素。我会提出一个新的解决方案作为#4,你将逻辑放在一个单独的类中。 (使其以后更易于维护)。
  • @itachi 你有这方面的例子可以给我看吗?

标签: php model-view-controller laravel eloquent laravel-3


【解决方案1】:

我会选择选项一,但使用模型中的 lists() 方法对其进行简化。

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

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

【讨论】:

  • 完美——这正是我所需要的!
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    有一些 presenter bundles 和 Laravel 4 甚至有一些 presenter packages 可用。

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

    但要明确一点,最好的方法是为此使用lists() 方法,如上所述。不过还是给演示者看看吧。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-23
      • 2011-08-24
      • 1970-01-01
      • 1970-01-01
      • 2010-10-28
      • 2011-06-09
      • 2011-07-18
      • 1970-01-01
      相关资源
      最近更新 更多