在Laravel 4中调用视图中的方法


Calling a method within a view in Laravel 4

让我先说一下,我是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.

的视图时都发送userTypes变量。