laravel在控制器中的所有方法之间共享变量

时间:2013-09-10 14:46:20

标签: php variables layout controller laravel

我正在PHP laravel框架中创建一个简单的网站,其中顶部导航链接是从数据库动态生成的。我在家庭控制器操作中生成$ pages变量并传递给布局文件。我的代码如下:

 public function home()
{
    $pages = Page::all();
    return View::make('home')->with('pages', $pages);
}

public function login()
{
    return View::make('login');
}

但是当我尝试访问登录操作时,我得到错误变量$ pages,因为在页面文件中访问了$ pages变量。如何在控制器中的所有操作中共享相同的变量?

5 个答案:

答案 0 :(得分:3)

我认为一种相当直接的方法是使用控制器的构造函数。有时候能够从控制器中看到控制器中所有方法可用的变量,而不是隐藏在某个地方的服务提供商中,这有时很有用。

class MyController extends BaseController
{
    public function __construct()
    {
        view()->share('sharedVar', 'some value');
    }

    public function myTestAction()
    {
        view('view.name.here');
    }
}

在视图中:

<p>{{ $sharedVar }}</p>

答案 1 :(得分:2)

您可以像以下一样使用单身

App::singleton('data', function() { return array('abc' => 1); });

这样,您可以在控制器或模板中的任何位置调用它,如

$data = App::make('data');

在此之后,您可以尝试使用Phil开发的捆绑包https://github.com/Phil-F/Setting。安装完成后,您可以通过

在控制器或模板中引用它
Setting::get('title')

当然,您可以使用

在任何地方进行设置
Setting::set('title', 'Portfolio');

设置允许您将它们存储在缓存和json文件中,这可能是获取值的另一种方法。

答案 2 :(得分:1)

我使用Laravel的视图编辑器解决了这个问题。我创建了一个header.blade.php并将$ pages变量传递给它,并将以下代码添加到我的routes.php文件中。

View::composer('header', function($view){
   $pages = Page::all();
   $view->with('pages', $pages);
});   

答案 3 :(得分:0)

您忘记在登录操作中添加参数。

public function login()
{
    $pages = Page::all();
    return View::make('login')->with('pages',$pages);
}

我的回复:

要在控制器中的所有操作之间共享相同的变量,原始PHP应该可以帮助您:

<?php

Class MyController Extends BaseController {
    var $pages = Page::all();

     public function home()
    {
        return View::make('home')->with('pages', $this->pages);
    }

    public function login()
    {
        $pages = $this->pages;
        return View::make('login');
    }
}

但就个人而言,我更愿意在模型中创建变量,例如:

<?php

Class Page extends Eloquent {

    public static $all_ages = Page::all();
}

并访问它:

Page::$all_pages;

答案 4 :(得分:0)

共享变量

app/Providers/AppServiceProvider

# app/Providers/AppServiceProvider.php


public function boot()
{
   // add this
    view()->share('someKey', 'This is shared data');
}