在任何视图文件Laravel中提供内容

时间:2014-05-13 18:50:02

标签: php laravel

我有一个关于在任何视图文件中提供某些元素的问题

让我们说我正在建立一个网上商店,在每一页上我都会有我的侧边栏,购物车,用户问候语。

如何在所有视图文件中提供这些内容?

我可以上课,让我们说班级前端

我可以这样做:

class Frontend {

    static $me;

    public function get(){
        if(!self::$me){
            self::$me = new self();
        }
        return self::$me;
    }

    private function getShoppingCart(){
        // do things 
    }

    public function getData(){


        return array(
                'Username' => User::find(1)->UserName,
                'Cart' => $this->getShoppingCart()
        );

    }

}

现在在我的控制器中,我可以将这个Frontend对象传递到视图中

View::make('file.view')->with(array('data' => Frontend::get()->getData()));

但是这样我最终会得到一个包含太多东西的神类,并且在每个控制器方法中我都必须传递这些数据,这与控制器方法无关

Laravel中是否有办法在所有视图文件中提供特定数据?

谢谢!

3 个答案:

答案 0 :(得分:2)

使用share

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

根据http://laravel.com/docs/responses#views

答案 1 :(得分:1)

你和上帝的班级很接近'理念。 在basecontroller中设置$ data变量帮助我解决了类似的问题

class BaseController extends Controller {


protected $data;

public function __construct() {

    $this->data['Username'] =  User::find(1)->UserName
    $this->data['Cart'] = $this->getShoppingCart()
 }
}

class Frontend extends BaseController {

   function someMethod(){
      View::make('file.view', $this->data)
   }
}    

答案 2 :(得分:1)

为了保持一切清洁,页面的每个部分都应该是它自己的*.blade.php文件,它将使用各种主模板放在一起。

master.blade.php

@yield('includes.sidebar')

@yield('users.greeting')

@yield('store.shoppingcart')

然后您可以使用view composers,这样每次加载这些视图时,都会将所需的数据注入其中。我可能会创建一个可以自动加载的新文件,或者如果你有这些视图会使用的应用程序的不同部分的服务提供程序,那么它也会很棒。

View::composer('users.greeting', function($view)
{
    $view->with('user', Auth::user());
});

在这种情况下,它会使您的视图中的用户模型可用。这样可以非常轻松地管理将哪些数据注入到您的视图中。