让我先说一下,我是Laravel和MVC的新手。我想做的事情似乎很简单,但我不确定在Laravel内做这件事的正确方法。我有一个菜单/侧边栏视图,看起来像这样:
@if( Auth::check() )
<h4>Item Types</h4>
<ul>
{{ listUserTypes() }}
</ul>
@endif
我想做的是从MySQL中获取当前用户存在的任何"类型",并通过它们作为<li>
s循环。我知道将login放入视图绝对是错误的方法,但我不确定正确的替代方法。是适当的把我的DB查询作为方法listUserTypes()
在我的控制器,如果是这样,我怎么在视图内调用?
当你使用MVC模式,正确的方式应该是在你的模型中定义关系,在你的控制器中获取数据,并使你的视图尽可能"哑",也就是说,视图应该只显示数据w/o知道在哪里或如何检索数据。在视图中使用函数意味着你的视图太"聪明"了。
// =========== 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>
你的视图应该是"哑"的。每当您发现自己处于视图需要数据的情况下,假设它已经可以访问它的代码:
@foreach( $userTypes as $userType )
<li>{{ $userType }}</li>
@endforeach
然后在控制器中,传递数据给它:
return View::make('pages.homepage')
->with('userTypes', $userTypes);
我认为你应该在你的模型中有这个函数(一个"范围"函数检索给定用户的所有类型)。然后,在控制器中调用这个函数,将result(数组)存储在一个变量中,并将其传递给视图。然后,你可以很容易地使用它。
模型/类型实体
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));
<<p> 视图/strong> <ul>
@foreach($types as $type)
<li>{{ $type->label }}</li>
@endforeach
</ul>
其中label是要显示的值
我会将DB查询放在用户模型中的方法中。
然后,你可以像这样调用这个方法:
Auth::user()->listUserTypes()
如果你不想在视图中直接调用模型,另一个选择是使用Laravel的视图编写器功能。
http://laravel.com/docs/responses view-composers
View::composer(array('menu.sidebar'), function($view)
{
$view->with('userTypes', Auth::user()->listUserTypes());
});
有了这个,每次你的菜单。, userTypes变量将被提供。
这样你就不必在每次呈现包含menu.sidebar.