Laravel 5ですべてのBladeテンプレートで使用できるグローバル変数を作成するにはどうすればよいですか?
オプション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
にcomposerファイルを作成しますNB: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');
}
}
これにより、composerを任意のビューに添付できます
<?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');
}
}
新しいサービスプロバイダーを構成ファイル(config/app.php)に追加します。
新しいサービスプロバイダーの起動方法では、次を使用します。
View::share( 'something_cool', 'this is a cool shared variable' );
これで、すべてのビューで$ something_coolを使用する準備ができました。
お役に立てれば。
同じ問題の解決策を検索し、Laravelドキュメントで最適な解決策を見つけました。次のようにAppServiceProvider
でView::share
を使用するだけです。
View::share('key', 'value');
詳細 ここ 。
view composers でこれを行うことができます。ビューコンポーザは、テンプレートがロードされるときに実行されます。そのビューの追加機能を使用してクロージャーを渡すことができます。ビューコンポーザーでは、ワイルドカードを使用できます。すべてのビューに対してcomposerビューを作成するには、*
を使用します。
View::composer('*', function($view)
{
$view->with('variable','Test value');
});
ドキュメントで見ることができるように、クロージャなしでこれを行うこともできます。
View::composer('*', 'App\Http\ViewComposers\ProfileComposer');
プロファイルcomposerクラスには、composeメソッドが必要です。
ビューコンポーザーは、ビューがレンダリングされるときに実行されます。 Laravelにはビュー作成者もいます。これらは、ビューがインスタンス化されるときに実行されます。
SetupLayoutメソッドでBaseController
を使用することもできます。次に、ロードするすべてのビューは、いくつかの追加データを追加するsetupLayoutメソッドを通じてロードされます。ただし、ビューコンポーザーを使用することで、コードが確実に実行されます。ただし、BaseControllerアプローチを使用すると、余分なデータの読み込みをスキップできるため、柔軟性が向上します。
編集:Nic Gutierrezが述べたように、ビュー共有も使用できます。
また、Route.php
ファイルでこれを行うことができます。
view()->share('variableName', $variable);
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'] }}
EDIT:Nic Gutierrezのサービスプロバイダーの答えは、より良い(または最良の)ソリューションかもしれません。
View::share('key', 'value');
はView::share(['key'=>'value','key'=>'value'])
のような配列を配置できるだけでなく、配列を指定できます