我如何在Laravel 5中创建可在所有Blade模板中使用的全局变量?
答案 0 :(得分:72)
选项1:
你可以这样使用view::share()
:
<?php namespace App\Http\Controllers;
use View;
//You can create a BaseController:
class BaseController extends Controller {
public $variable1 = "I am Data";
public function __construct() {
$variable2 = "I am Data 2";
View::share ( 'variable1', $this->variable1 );
View::share ( 'variable2', $variable2 );
View::share ( 'variable3', 'I am Data 3' );
View::share ( 'variable4', ['name'=>'Franky','address'=>'Mars'] );
}
}
class HomeController 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(){
//All variable will be available in views
return view('home');
}
}
选项2: 使用作曲家:
app\Composers\HomeComposer.php
注意:创建app\Composers
如果它不存在
<?php namespace App\Composers;
class HomeComposer
{
public function compose($view)
{
//Add your variables
$view->with('variable1', 'I am Data')
->with('variable2', 'I am Data 2');
}
}
然后,您可以通过执行此操作将作曲家附加到任何视图
<?php namespace App\Http\Controllers;
use View;
class HomeController extends Controller{
public function __construct(){
View::composers([
'App\Composers\HomeComposer' => ['home'] //attaches HomeComposer to home.blade.php
]);
}
public function Index(){
return view('home');
}
}
答案 1 :(得分:24)
Create a new Service Provider as suggested in here
将新的服务提供商添加到配置文件(config / app.php)。
在新服务提供商的启动方法中使用:
View::share( 'something_cool', 'this is a cool shared variable' );
现在您已准备好在所有视图中使用$ something_cool。
希望这有帮助。
答案 2 :(得分:10)
您可以使用view composers执行此操作。加载模板时会执行视图编辑器。您可以为该视图传递具有附加功能的Closure。使用视图编辑器,您可以使用通配符。要为每个视图制作视图编辑器,只需使用*
。
View::composer('*', function($view)
{
$view->with('variable','Test value');
});
您也可以在没有闭包的情况下执行此操作,如文档中所示。
View::composer('*', 'App\Http\ViewComposers\ProfileComposer');
配置文件编辑器类必须具有撰写方法。
在渲染视图时执行视图编辑器。 Laravel也观看了创作者。这些是在实例化视图时执行的。
您还可以选择使用带有setupLayout方法的BaseController
。然后,您将加载的每个视图都通过setupLayout方法加载,该方法会添加一些额外的数据。但是,通过使用视图编辑器,您可以确定代码是否已执行。但是使用BaseController方法,您可以更加灵活,因为您可以跳过加载额外数据。
编辑:正如Nic Gutierrez所提到的,您也可以使用视图共享。
答案 3 :(得分:10)
搜索相同问题的解决方案,并在Laravel文档中找到最佳解决方案。只需在View::share
中使用AppServiceProvider
,就像这样:
View::share('key', 'value');
详情here。
答案 4 :(得分:3)
另外,您可以在Route.php
文件中执行此操作:
view()->share('variableName', $variable);
答案 5 :(得分:0)
您不仅可以给数组View::share('key', 'value');
,还可以给数组View::share(['key'=>'value','key'=>'value'])
答案 6 :(得分:0)
我宁愿将中间件与view()
门面帮助程序一起使用。 (Laravel 5.x)
中间件易于维护,不会在控制器类树中造成混乱。
/app/Http/Middleware/TimezoneReset.php
要创建中间件,您可以运行php artisan make:middleware GlobalTimeConfig
share()
您需要共享的数据
<?php
namespace App\Http\Middleware;
use Closure;
class GlobalTimeConfig
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
$time_settings = [
'company_timezone' => 'UTC',
'company_date_format' => 'Y-m-d H:i:s',
'display_time' => true,
];
view()->share('time_settings', $time_settings);
return $next($request);
}
}
按照以下示例将中间件添加到您的中间件路由组中
/app/Http/Kernel.php
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\GlobalTimeConfig::class,
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
// \Illuminate\Session\Middleware\AuthenticateSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
'api' => [
'throttle:60,1',
'bindings',
],
];
使用View :: share()方法调用中的给定键从任何模板访问数据
例如:
Company timezone: {{ $time_settings['company_timezone'] }}
编辑: Nic Gutierrez的服务提供商答案可能是更好(或最好)的解决方案。
答案 7 :(得分:-2)
您可以添加Controller.php
文件:
use App\Category;
然后:
class Controller extends BaseController {
public function __construct() {
$categories = Category::All();
\View::share('categories', $categories);
}
}
答案 8 :(得分:-7)
你可以将它闪存到会话中,你可以在.env文件中定义它(静态变量)