Laravel:将默认变量传递给视图


Laravel: Passing default variables to view

在Laravel中,我们都以与几乎相同的方式将数据传递到视图

$data = array(
    'thundercats' => 'Hoooooooooooh!'
);
return View::make('myawesomeview', $data);

但是,有没有办法将默认变量添加到视图中,而不必在$data中反复声明它?如果网站需要,这将非常有助于重复变量,如用户名、PHP逻辑,甚至CSS样式

使用视图生成器

视图编写器是回调或类方法,当视图已创建。如果您有要绑定到给定视图的数据每次在整个应用程序中创建该视图时composer可以将代码组织到一个位置。因此视图编辑器的功能可能类似于"视图模型"或"演示者"。

定义视图生成器:

View::composer('profile', function($view)
{
    $view->with('count', User::count());
});

现在,每次创建纵断面图时,计数数据都将绑定到该视图。在您的情况下,可能是id:

    View::composer('myawesomeview', function($view)
    {
        $view->with('id', 'someId');
    });

因此,每次使用创建视图时,$id将可用于myawesomeview视图

View::make('myawesomeview', $data);

您也可以同时将视图编辑器附加到多个视图:

View::composer(array('profile','dashboard'), function($view)
{
    $view->with('count', User::count());
});

如果您更愿意使用基于类的composer,它将提供通过应用程序IoC Container解决的好处,那么您可以这样做:

View::composer('profile', 'ProfileComposer');

视图编辑器类应该这样定义:

class ProfileComposer {
    public function compose($view)
    {
        $view->with('count', User::count());
    }
}

文档,你也可以阅读这篇文章。

有几种方法,到目前为止我已经尝试了一些。

1.使用singleton,可以将其放在routes.php 中

App::singleton('blog_tags', function() {
  return array(
    'Drupal'    => 'success',
        'Laravel'   => 'danger',
        'Symfony'   => 'dark',
        'Wordpress' => 'info'
    );
});

2.使用设置捆绑包,在此处下载。https://github.com/Phil-F/Setting.您可以将其放入控制器或模板中。

Setting::set('title', 'Scheduler | Mathnasium');

3.使用视图共享,在你的模板中使用它

Controller: Views::share('theme_path', 'views/admin/');
Template: <link href="{{ $theme_path }}/assets/bootstrap.min.css"/>

4.在我目前的示例设置中,我在HomeController中编写了一个构造。

public function __construct()
{
    // Define a theme namespace folder under public
    View::addLocation('../public/views/admin');
    View::addNamespace('admin', '../public/views/admin');
    View::share('theme_path', 'views/admin/');

    // Set default page title
    Setting::set('title', 'Scheduler | Mathnasium');
    Setting::set('description', 'daily customer scheduler.');
    Setting::set('keywords', ['Reservation', 'Planner']);
    Setting::set('page-title', '');
}

@enchance,作为使用"*"的替代方案,正如您在评论中提到的,也许View::share也会对您有所帮助。来自Laravel文档:

您还可以在所有视图中共享一段数据:

视图::共享('name','Steve');

摘录自http://laravel.com/docs/responses

是的,绝对有办法——请参阅视图中的作曲家。

您可以使用它向视图或视图集添加数据。