Laravel:向视图传递默认变量

5
在Laravel中,我们都以几乎相同的方式将数据传递给视图。
$data = array(
    'thundercats' => 'Hoooooooooooh!'
);
return View::make('myawesomeview', $data);

但是是否有一种方法可以在视图中添加默认变量,而不必在$data中一遍又一遍地声明它?对于重复使用的变量,如用户名、PHP逻辑甚至CSS样式(如果网站需要),这将非常有帮助。

4个回答

13

使用视图组合器

视图组合器是在创建视图时调用的回调或类方法。如果您有想要绑定到应用程序中每次创建视图时给定视图的数据,视图组合器可以将该代码组织到一个单独的位置。因此,视图组合器可以像“视图模型”或“展示者”一样起作用。

定义视图组合器:

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容器解决,并且您可以这样做:

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

视图组合器类应该这样定义:

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

文档,同时您也可以阅读这篇文章


我测试过了,它可以工作。但是如何使其适用于所有视图?必须为每个单独的视图编写它似乎是冗余的。如果你只有几个视图,那么这没问题,但如果你有100多个视图呢? - enchance
然后,您需要将该数据添加到模板中,您没有检查我给您的链接,请在此处检查 - The Alpha
我在工作中没有设置PHP开发环境来测试,但您可以使用路由组和前置过滤器来为组内的所有视图包含视图组合器吗?或者,您可以将视图组合器绑定到主布局,而不是绑定单个视图?这只是我的一些想法。 - Collin Henderson
8
为了针对所有视图,我使用 '*' 而不是指定特定视图。效果非常好。 - enchance
哇!太棒了 :-) - The Alpha
如何从控制器中调用 View::make('_myPartial', $data);?但是,如何在全局范围内放置它,并且如果需要,我如何从我的控制器中覆盖 $data - Sebastian Corneliu Vîrlan

3

有几种方法可以实现,目前我已经试验了一些。

1.使用单例,在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.使用View Share,在模板中广泛使用它。

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', '');
}

1

@enchance,作为您在评论中提到的使用“*”的替代方法,也许View::share也能帮助您。 Laravel文档中提到:

您还可以在所有视图之间共享数据:

View::share('name','Steve');

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


0

是的,绝对有一种方法 - 在view composers这里查看。

您可以使用它来向视图或一组视图添加数据。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接