Laravel compartilha variável em todos os methods em um controlador

Estou fazendo um site simples no framework PHP laravel, onde os principais links de navegação estão sendo gerados dinamicamente a partir do database. Estou gerando a variável $ pages na ação do controlador doméstico e passando para o arquivo de layout. Meu código é o seguinte:

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

Mas quando eu tento acessar a ação de login, eu recebo a variável de erro $ pages não encontrada desde que a variável $ pages está sendo acessada no arquivo de layout. Como posso compartilhar a mesma variável em todas as ações em um controlador?

Você pode usar o singleton como o seguinte

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

Desta forma, você pode chamá-lo em qualquer lugar em seu controlador ou modelo como

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

Depois disso, você pode tentar usar um pacote desenvolvido por Phil aqui, https://github.com/Phil-F/Setting . Uma vez instalado, você pode simplesmente encaminhá-lo no controlador ou no modelo por

 Setting::get('title') 

Claro, você pode configurá-lo em qualquer lugar usando

 Setting::set('title', 'Portfolio'); 

O ajuste permite que você armazene ambos no arquivo cache e json, que pode ser outra maneira de recuperar o valor.

Resolvi o problema usando o compositor da visão de Laravel. Eu fiz um header.blade.php e passei a variável $ pages e adicionei o seguinte código ao meu arquivo routes.php.

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

Você esqueceu de dar ao View também as $ pages como você fez no método home.

Você esqueceu de adicionar como um parâmetro dentro de sua ação de login.

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

Minha resposta mais antiga:

Para compartilhar a mesma variável em todas as ações em um controlador, PHP bruto deve ajudá-lo:

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

Mas, pessoalmente, prefiro fazer uma variável no modelo, algo como:

 < ?php Class Page extends Eloquent { public static $all_ages = Page::all(); } 

E acessá-lo como:

 Page::$all_pages; 

Eu acho que uma maneira bastante direta de fazer isso é usando o construtor do controlador. Às vezes, é útil poder ver os vars disponíveis para todos os methods em um controlador dentro desse controlador, em vez de escondidos em um provedor de serviços em algum lugar.

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

E na visão:

 

{{ $sharedVar }}