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

时间:2014-08-13 07:12:45

标签: php laravel laravel-4

让我先说一下我是Laravel和MVC的新手。我想做的事情似乎很简单,但我不确定在Laravel内部做这件事的正确方法。我有一个菜单/侧边栏视图,如下所示:

@if( Auth::check() )

    <h4>Item Types</h4>
        <ul>
            {{ listUserTypes() }}
        </ul>
@endif

我想做的是从MySQL获取任何&#39;类型&#39;当前用户存在并以<li> s循环遍历它们。我知道登录视图绝对是错误的做法,但我不确定正确的选择。将我的数据库查询作为方法listUserTypes()放在我的控制器中是否合适,如果是这样,我将如何在视图中调用它?

4 个答案:

答案 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变量。