Laravel 5.2'Master Layout'变量传递

时间:2016-08-10 14:33:28

标签: php laravel laravel-5 laravel-5.2 laravel-blade

所以这就是我想要实现的目标。我有一个默认的刀片模板default.blade.php,它由我的所有子视图扩展。

在我的default.blade.php中,我有一个foreach循环,向用户表示一些'全局'选项,其示例如下。

@foreach ($projects as $p)
    <li><a href='$p->project_uid'>{{ $p->project_name }}</a></li>
@endforeach

为了达到这个目的,我必须通过$projectsview('viewname', $data)中的View::share('projects', $projects);传递__construct()变量

我是否有更好的方法在全球意义上做到这一点,以便不需要进行上述调用?

我所知道的一个选项是在我的视图中调用Model函数,但这违背了MVC的概念,因此并不理想。

对此主题的任何指导将不胜感激,谢谢。

编辑1

所以我尝试了ViewComposer解决方案,但遇到了一些问题。 以下是我的作曲家&amp;服务提供商注册。

配置/ app.php

App\Providers\ComposerServiceProvider::class,

ComposerServiceProvider     

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class ComposerServiceProvider extends ServiceProvider {
    /**
     * Register bindings in the container.
     *
     * @return void
     */
    public function boot() {
        // Using class based composers...
        view ()->composer ( 'default', 'App\Http\ViewComposers\MasterComposer' );
    }

    /**
     * Register the service provider.
     *
     * @return void
     */
    public function register() {
        //
    }
}

MasterComposer

<?php

namespace App\Http\ViewComposers;

use Illuminate\View\View;
use App\Repositories\UserRepository;
use Sentinel;
use ProjectUsers;

class MasterComposer
{

    protected $users;

    public function __construct(ProjectUsers $users)
    {
        $uid = Sentinel::getUser()->id;
        $this->users = ProjectUsers::where("user_id", '=', $uid)->get();
    }

    public function compose(View $view)
    {
        $view->with('projects', $this->users);
    }
}

我错过了一些明显的东西,因为它似乎根本就没有加载Composer。

编辑2

我自己修好了。意识到在ComposerServiceProvider中我需要像我这样指定一个完整的路径。

view ()->composer ( 'admin/layouts/default', 'App\Http\ViewComposers\MasterComposer' );

现在可行:D

1 个答案:

答案 0 :(得分:5)

是的,您使用View Composer执行此操作。

  

视图作曲家是a时调用的回调或类方法   视图呈现。如果您有要绑定到视图的数据   每次渲染视图时,视图编辑器都可以帮助您进行组织   把这个逻辑放到一个地方。

将该数据绑定到defualt.blade.php视图,例如:

public function compose(View $view)
{
    $data = .... // Get data here.
    $view->with('projects', $data);
}