在 PHP 中,我曾经在 my 中定义一些变量header.php
并在所有页面中使用它们。我怎么能在 Laravel 中有这样的东西?
我不是在谈论View::share('xx', 'xx' );
假设我想要一个包含一个数字的变量,并且我需要在我的所有控制器中使用这个数字来计算一些东西。
在 PHP 中,我曾经在 my 中定义一些变量header.php
并在所有页面中使用它们。我怎么能在 Laravel 中有这样的东西?
我不是在谈论View::share('xx', 'xx' );
假设我想要一个包含一个数字的变量,并且我需要在我的所有控制器中使用这个数字来计算一些东西。
听起来像是配置文件的一个很好的候选者。
创建一个新的,我们称之为calculations.php
:
Laravel ~4ish:
app
config
calculations.php
Laravel 5,6,7+:
config
calculations.php
然后将内容放入新的配置文件中:
<?php return [ 'some_key' => 42 ];
然后在某处检索代码中的配置(注意文件名成为配置项的“命名空间”):
echo Config::get('calculations.some_key'); // 42 in Laravel ~4
echo config('calculations.some_key'); // 42 in Laravel ~5,6,7+
在 上设置一个属性,该属性BaseController
应该位于您的controllers
目录中。
您的控制器应该扩展BaseController
该类并因此继承其属性。
您可以使用View Composers
而不是使用文档中描述的引导方法,您可以使用:
public function boot()
{
// Using class based composers...
view()->composer(
'*', 'App\Http\ViewComposers\ProfileComposer'
);
// Using Closure based composers...
view()->composer('*', function ($view) {
});
}
这将呈现您声明的任何变量
$view->with('yourVariableName', 'yourVariableValue');
到您的应用程序中的所有视图。
这是我如何在我的一个项目中使用它的完整示例。
应用程序/提供者/ComposerServiceProvider.php
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class ComposerServiceProvider extends ServiceProvider
{
/**
* Bootstrap the application services.
*
* @return void
*/
public function boot()
{
view()->composer(
'*', 'App\Http\ViewComposers\UserComposer'
);
}
/**
* Register the application services.
*
* @return void
*/
public function register()
{
//
}
}
应用程序/Http/ViewComposers/UserComposer.php
<?php
namespace App\Http\ViewComposers;
use Illuminate\Contracts\View\View;
use Illuminate\Contracts\Auth\Guard;
class UserComposer
{
protected $auth;
public function __construct(Guard $auth)
{
// Dependencies automatically resolved by service container...
$this->auth = $auth;
}
public function compose(View $view)
{
$view->with('loggedInUser', $this->auth->user());
}
}
请记住,因为您声明了一个新的服务提供者,所以它需要包含在config/app.php的“提供者”数组中
您可以在 中定义它们app\Http\Controllers\Controller.php
,例如:
<?php
namespace App\Http\Controllers;
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
use Illuminate\Foundation\Bus\DispatchesJobs;
use Illuminate\Foundation\Validation\ValidatesRequests;
use Illuminate\Routing\Controller as BaseController;
class Controller extends BaseController
{
public $test = 'something';
use AuthorizesRequests, DispatchesJobs, ValidatesRequests;
}
然后在所有控制器中,您可以通过执行以下操作访问此属性:
$this->test;