我正在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变量。如何在控制器中的所有操作中共享相同的变量?
答案 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');
}