让我先说一下我是Laravel和MVC的新手。我想做的事情似乎很简单,但我不确定在Laravel内部做这件事的正确方法。我有一个菜单/侧边栏视图,如下所示:
@if( Auth::check() )
<h4>Item Types</h4>
<ul>
{{ listUserTypes() }}
</ul>
@endif
我想做的是从MySQL获取任何&#39;类型&#39;当前用户存在并以<li>
s循环遍历它们。我知道登录视图绝对是错误的做法,但我不确定正确的选择。将我的数据库查询作为方法listUserTypes()
放在我的控制器中是否合适,如果是这样,我将如何在视图中调用它?
答案 0 :(得分:2)
你的观点应该是愚蠢的#34;每当您发现自己处于视图需要数据的情况时,代码假设它已经可以访问它:
@foreach( $userTypes as $userType )
<li>{{ $userType }}</li>
@endforeach
然后在控制器中,将数据传递给它:
return View::make('pages.homepage')
->with('userTypes', $userTypes);
答案 1 :(得分:2)
当您使用MVC模式时,正确的方法应该是定义模型中的关系,获取控制器中的数据并使您的视图变得“愚蠢”。尽可能地,视图应该只显示数据,而不知道数据的检索位置和方式。在视图中使用功能意味着您的视图太聪明了。
// =========== models/User.php ===========
public function types()
{
return $this->hasMany('Type');
}
// =========== controllers/SomeController.php ===========
$user = Auth::user();
return View::make('some.view')->withTypes($user->types);
// =========== some/view.blade.php ===========
<ul>
@foreach ($types as $type)
<li>{{ $type->name }}</li>
@endforeach
</ul>
答案 2 :(得分:1)
我认为你应该在你的模型中使用这个功能(&#34;范围&#34;函数检索给定用户的所有类型)。然后,在控制器中调用此函数,将结果(数组)存储在变量中并将其传递给视图。然后,您可以轻松使用它。
模型/类型实体
public function scopeByUser($query, $user) {
return $query->...; // Make your query to retrieve types using passed user.
}
<强>控制器强>
$types = Type::byUser($user)->get();
return View::make('myview', array('types' => $types));
查看强>
<ul>
@foreach($types as $type)
<li>{{ $type->label }}</li>
@endforeach
</ul>
其中label是您要显示的值。
答案 3 :(得分:0)
我会将数据库查询放在用户模型中的方法中。
然后,您将能够像这样调用此方法:
Auth::user()->listUserTypes()
如果您不想直接在视图中调用模型,另一个选择是使用Laravel的视图编辑器功能。
http://laravel.com/docs/responses#view-composers
View::composer(array('menu.sidebar'), function($view)
{
$view->with('userTypes', Auth::user()->listUserTypes());
});
这样,每次调用menu.sidebar视图时,都会提供userTypes变量。
这样,您每次渲染包含 menu.sidebar 的视图时都不必发送userTypes变量。