【问题标题】:Laravel 5.2 'Master Layout' Variable passingLaravel 5.2“主布局”变量传递
【发布时间】:2016-12-17 00:18:00
【问题描述】:

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

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

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

因此,为了实现这一点,我必须通过 view('viewname', $data) 或通过控制器 __construct() 中的 View::share('projects', $projects); 传递 $projects 变量

有没有更好的方法让我在全球范围内做到这一点,这样就不需要进行上述调用?

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

任何关于该主题的指导将不胜感激,谢谢。

编辑 1

所以我尝试了 ViewComposer 解决方案,但遇到了几个问题。 以下是我的作曲家和服务提供商注册。

配置/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() {
        //
    }
}

作曲大师

<?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

【问题讨论】:

  • 这里很好的问答,谢谢,有没有更简单/更容易的方法来做到这一点?喜欢 view::make view::share 吗?

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


【解决方案1】:

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

View Composer 是回调或类方法,当 视图被渲染。如果您有想要绑定到视图的数据 每次呈现该视图时,视图编辑器都可以帮助您组织 将该逻辑放到一个位置。

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

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

【讨论】:

  • 那么离开文档的例子我应该通过服务注册作曲家吗?我没有看到您在文档中提供的示例。
  • 我想我明白了。我明天将尝试解决方案
  • 是的,您应该创建服务提供者并将其添加到config/app.php 的列表中。然后你应该创建视图作曲家。仔细看,文档中有完整的示例(在服务提供商示例之后,您可以在页面上使用搜索class ProfileComposer)。
  • 我试了一下,遇到了一些问题。编辑了我的问题
猜你喜欢
  • 2014-05-22
  • 1970-01-01
  • 2022-11-11
  • 2014-05-13
  • 2017-01-30
  • 1970-01-01
  • 2017-01-08
  • 2016-11-20
  • 1970-01-01
相关资源
最近更新 更多