Laravel 5无法将变量传递给所有视图

时间:2015-04-13 07:11:22

标签: php laravel laravel-5

我将变量(数据)传递给所有视图时遇到问题。我创建了扩展默认Laravel控制器的BaseController,并在那里定义了“全局”变量。当我使用BaseController扩展其他控制器时,我得到错误,即未定义变量。有人知道问题出在哪里吗?

这是代码:

namespace App\Http\Controllers;

use App\Http\Requests;
use App\Http\Controllers\Controller;
use Sentry;
use Illuminate\Http\Request;
use View;

class BaseController extends Controller {
    public function __construct() {
        $obavijesti="Other data";
        $izbornici="Some data";
        View::share ( 'izbornici', $izbornici );
        View::share ( 'obavjesti', $obavjesti );
        }
   }

class AdminController extends BaseController {
     .
     .
     .
      echo '<pre>';var_dump($izbornici);echo '</pre>';//Error pop ups here

     .
     .
     .
}

2 个答案:

答案 0 :(得分:3)

你这里做错了什么。 view :: share()用于跨所有视图而不是控制器共享一段数据。

namespace App\Http\Controllers;

use App\Http\Requests;
use App\Http\Controllers\Controller;
use Sentry;
use Illuminate\Http\Request;
use View;

//If you wish to get these variables in your other controllers you do this:

class BaseController extends Controller {

    public $obavijesti="Other data";
    public $izbornici="Some data";

    public function __construct() {
       View::share ( 'izbornici', $this->izbornici );
       View::share ( 'obavjesti', $this->obavjesti );
    }  

}

class AdminController extends BaseController {

    //if you have a constructor in other controllers you need call constructor of parent controller (i.e. BaseController) like so:

    public function __construct(){
       parent::__construct();
    }

    public function Index(){
      echo $this->obavijesti;
    }

}

您还可以使用编辑器将变量分享给视图

//1. Create a composer file at app\Composers\AdminComposer.php
//NB: create "app\Composers" if does not exists

//2. Inside AdminComposer.php add this.


<?php namespace App\Composers;

class AdminComposer
{
    public function __construct()
    {

    }

    public function compose($view)
    {
        //Add your variables
        $view->with('izbornici',      'Other data')
            ->with('obavjesti',       'Some other data');
    }
}

//3. In you controller do this:

<?php namespace App\Http\Controllers;
//NB: I removed your BaseController because I believe the issue is coming from //there

use App\Http\Requests;
use App\Http\Controllers\Controller;
use Sentry;
use Illuminate\Http\Request;
use View;

class AdminController extends Controller{


    public function __construct(){
        //Lets use AdminComposer to share variables to adminpage.blade.php view

        View::composers([
            'App\Composers\AdminComposer'  => array('adminpage')
        ]);

    }

    public function Index(){
        return view('adminpage');
    }

}

答案 1 :(得分:2)

理想情况下,您需要将所拥有的内容与此处发布的其他答案相结合。

<?php

class BaseController extends Controller {
    protected $obavijesti = 'Other data';
    protected $izbornici = 'Some data';

    public function __construct() {
        View::share('obavjesti', $this->obavjesti);
        View::share('izbornici', $this->izbornici);
    }
}

然后,在您的所有观看中,您都可以访问变量$obavjesti$izbornici。现在在您的其他控制器中,任何扩展BaseController的内容都可以执行以下操作:

class AdminController extends BaseController {

    public function index() {
        echo $this->ixbornici;
        echo $this->obavjesti;
    }
}