Laravel 5.2 'Master Layout' 变量传递
Laravel 5.2 'Master Layout' Variable passing
这就是我要实现的目标。我有一个默认的 blade 模板 default.blade.php
,它由我所有的 child 视图扩展。
在我的 default.blade.php
中,我有一个 foreach 循环,它向用户表达了一些 'global' 选项,下面是示例。
@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 解决方案,但 运行 遇到了几个问题。
下面是我的作曲家和服务提供商注册。
Config/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 Composer 来做。
View composers are callbacks or class methods that are called when a
view is rendered. If you have data that you want to be bound to a view
each time that view is rendered, a view composer can help you organize
that logic into a single location.
将该数据绑定到 defualt.blade.php
视图,例如:
public function compose(View $view)
{
$data = .... // Get data here.
$view->with('projects', $data);
}
这就是我要实现的目标。我有一个默认的 blade 模板 default.blade.php
,它由我所有的 child 视图扩展。
在我的 default.blade.php
中,我有一个 foreach 循环,它向用户表达了一些 'global' 选项,下面是示例。
@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 解决方案,但 运行 遇到了几个问题。 下面是我的作曲家和服务提供商注册。
Config/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 Composer 来做。
View composers are callbacks or class methods that are called when a view is rendered. If you have data that you want to be bound to a view each time that view is rendered, a view composer can help you organize that logic into a single location.
将该数据绑定到 defualt.blade.php
视图,例如:
public function compose(View $view)
{
$data = .... // Get data here.
$view->with('projects', $data);
}