5

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

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

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

4

4 回答 4

13

使用 View Composers

视图合成器是创建视图时调用的回调或类方法。如果每次在整个应用程序中创建视图时都希望将数据绑定到给定视图,则视图编辑器可以将该代码组织到一个位置。因此,视图编辑器的功能可能类似于“视图模型”或“演示者”。

定义 View 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());
});

如果您更愿意使用基于类的作曲家,这将提供通过应用程序IoC Container解析的好处,您可以这样做:

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

视图作曲家类应该像这样定义:

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

文档,您也可以阅读本文

于 2013-07-15T01:41:21.057 回答
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.使用视图共享,几乎在你的模板中使用它

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', '');
}
于 2014-06-16T15:40:28.767 回答
1

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

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

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

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

于 2014-02-22T15:07:52.700 回答
0

是的,绝对有办法 - 在这里查看作曲家

您可以使用它将数据添加到一个视图或一组视图。

于 2013-07-15T01:40:56.760 回答