Laravel 5アプリケーションのすべてのビューで、いくつかのデフォルトデータにアクセスできるようにします。
私はそれを検索しようとしましたが、Laravel 4の結果のみを見つけました。ドキュメント「すべてのビューでデータを共有する」 ここ を読みましたが、どうすればよいかわかりません。次のコードはどこに配置する必要がありますか?
View::share('data', [1, 2, 3]);
ご協力いただきありがとうございます。
この目標はさまざまな方法で達成できますが、
1。 BaseControllerを使用する
私が設定したい方法は、Laravel自身のBaseController
を拡張するController
クラスを作成し、そこにさまざまなグローバルなものを設定することです。他のすべてのコントローラーは、Laravelのコントローラーではなく、BaseController
から拡張されます。
class BaseController extends Controller
{
public function __construct()
{
//its just a dummy data object.
$user = User::all();
// Sharing is caring
View::share('user', $user);
}
}
2。フィルターの使用
アプリケーション全体のすべてのリクエストのビューに何かを設定したいという事実を知っている場合、リクエストの前に実行するフィルターを介して設定することもできます。これがLaravelのユーザーオブジェクトの処理方法です。
App::before(function($request)
{
// Set up global user object for views
View::share('user', User::all());
});
または
独自のフィルターを定義できます
Route::filter('user-filter', function() {
View::share('user', User::all());
});
簡単なフィルター呼び出しで呼び出します。
バージョン5に応じて更新*
3。ミドルウェアの使用
middleware
でView::share
を使用する
Route::group(['middleware' => 'SomeMiddleware'], function(){
// routes
});
class SomeMiddleware {
public function handle($request)
{
\View::share('user', auth()->user());
}
}
4。 View Composerを使用する
ビューComposerは、特定のデータをさまざまな方法でビューにバインドするのにも役立ちます。変数を特定のビューまたはすべてのビューに直接バインドできます。たとえば、要件に応じてビューcomposerファイルを保存する独自のディレクトリを作成できます。これらのビューcomposerファイルは、サービスを介してビューと対話します。
View composerメソッドは異なる方法を使用できます。最初の例は同じように見えます:
App\Http\ViewComposers
ディレクトリを作成できます。
サービスプロバイダー
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class ViewComposerServiceProvider extends ServiceProvider {
public function boot() {
view()->composer("ViewName","App\Http\ViewComposers\TestViewComposer");
}
}
その後、このプロバイダーをconfig/app.phpの「providers」セクションの下に追加します。
TestViewComposer
namespace App\Http\ViewComposers;
use Illuminate\Contracts\View\View;
class TestViewComposer {
public function compose(View $view) {
$view->with('ViewComposerTestVariable', "Calling with View Composer Provider");
}
}
ViewName.blade.php
Here you are... {{$ViewComposerTestVariable}}
このメソッドは、特定のビューのみに役立ちます。ただし、すべてのビューに対してViewComposerをトリガーする場合は、この単一の変更をServiceProviderに適用する必要があります。
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class ViewComposerServiceProvider extends ServiceProvider {
public function boot() {
view()->composer('*',"App\Http\ViewComposers\TestViewComposer");
}
}
参照
さらに明確にするために Laracast Episode
それでもわからないことがある場合はお知らせください。
独自の サービスプロバイダー (ViewServiceProvider
名が一般的)を作成するか、既存のAppServiceProvider
を使用できます。
選択したプロバイダーで、ブートメソッドにコードを配置します。
public function boot() {
view()->share('data', [1, 2, 3]);
}
これにより、すべてのビューで$data
変数にアクセスできるようになります。
ヘルパーの代わりにファサードを使用する場合は、view()->
をView::
に変更しますが、ファイルの先頭にuse View;
を忘れないでください
これが一番簡単だと思いました。新しいプロバイダーを作成し、'*'
ワイルドカードを使用して、すべてのビューにアタッチします。 5.3でも動作します:-)
<?php
namespace App\Providers;
use Illuminate\Http\Request;
use Illuminate\Support\ServiceProvider;
class ViewServiceProvider extends ServiceProvider
{
/**
* Bootstrap the application services.
* @return void
*/
public function boot()
{
view()->composer('*', function ($view)
{
$user = request()->user();
$view->with('user', $user);
});
}
/**
* Register the application services.
*
* @return void
*/
public function register()
{
//
}
}
最良の方法は、View::share('var', $value);
を使用して変数を共有することです
"*"
:を使用した作成に関する問題
次のアプローチを検討してください。
<?php
// from AppServiceProvider::boot()
$viewFactory = $this->app->make(Factory::class);
$viewFacrory->compose('*', GlobalComposer::class);
ブレードビューの例から:
@for($i = 0; $i<1000; $i++)
@include('some_partial_view_to_display_i', ['toDisplay' => $i])
@endfor
何が起こるのですか?
GlobalComposer
クラスは、App::make
を使用して1000回インスタンス化されます。composing:some_partial_view_to_display_i
は1000回処理されます。compose
クラス内のGlobalComposer
関数は、1000回呼び出されます。ただし、部分ビューsome_partial_view_to_display_i
は、GlobalComposer
で構成される変数とは関係ありませんが、レンダリング時間を大幅に増加させます。
最良のアプローチ?
グループ化されたミドルウェアとともにView::share
を使用します。
Route::group(['middleware' => 'WebMiddleware'], function(){
// Web routes
});
Route::group(['prefix' => 'api'], function (){
});
class WebMiddleware {
public function handle($request)
{
\View::share('user', auth()->user());
}
}
更新
ミドルウェアパイプラインで計算されたものを使用している場合は、単にlistenを適切なeventに変更するか、ビュー共有ミドルウェアをパイプラインの最後に配置できます。
ドキュメントは聞く https://laravel.com/docs/5.4/views#view-composers しかし、私はそれを分解します
アプリケーションのルートディレクトリでディレクトリapp\Providersを探し、ファイルComposerServiceProvider.php下のテキストをコピーして貼り付けて保存します。
<?php
namespace App\Providers;
use Illuminate\Support\Facades\View;
use Illuminate\Support\ServiceProvider;
class ComposerServiceProvider extends ServiceProvider
{
/**
* Register bindings in the container.
*
* @return void
*/
public function boot()
{
// Using class based composers...
View::composer(
'profile', 'App\Http\ViewComposers\ProfileComposer'
);
// Using Closure based composers...
View::composer('dashboard', function ($view) {
//
});
}
/**
* Register the service provider.
*
* @return void
*/
public function register()
{
//
}
}
アプリケーションのルートからConfig/app.phpを開き、ファイル内のProvidersセクションを探し、これをコピーして貼り付けます 'App\Providers\ComposerServiceProvider'、配列に。
これにより、Composerサービスプロバイダーを作成しました。そのようなビュープロファイルでアプリケーションを実行するとhttp:// yourdomain/something/profile、サービスプロバイダー ComposerServiceProviderが呼び出され、クラスApp\Http\ViewComposers\ProfileComposerがインスタンス化され、以下のブートメソッドまたは関数内のコードにより、メソッドComposerが呼び出されます。
// Using class based composers...
View::composer(
'profile', 'App\Http\ViewComposers\ProfileComposer'
);
ディレクトリパスapp/Httpに移動します
ViewComposersというディレクトリを作成します
ファイルを作成しますProfileComposer.php。
class ProfileComposer
{
/**
* The user repository implementation.
*
* @var UserRepository
*/
protected $users;
/**
* Create a new profile composer.
*
* @param UserRepository $users
* @return void
*/
public function __construct(UserRepository $users)
{
// Dependencies automatically resolved by service container...
$this->users = $users;
}
/**
* Bind data to the view.
*
* @param View $view
* @return void
*/
public function compose(View $view)
{
$view->with('count', $this->users->count());
}
}
ビューに移動するか、この場合はProfile.blade.phpに追加します
{{ $count }}
プロフィールページにユーザー数が表示されます。
すべてのページ変更のカウントを表示するには
// Using class based composers...
View::composer(
'profile', 'App\Http\ViewComposers\ProfileComposer'
);
に
// Using class based composers...
View::composer(
'*', 'App\Http\ViewComposers\ProfileComposer'
);
ドキュメント内:
通常、サービスプロバイダーのブートメソッド内でshareメソッドを呼び出します。 AppServiceProviderに自由に追加したり、個別のサービスプロバイダーを生成してそれらを格納したりできます。
私はMarwellnに同意します、単にブート関数のAppServiceProvider
に入れてください:
public function boot() {
View::share('youVarName', [1, 2, 3]);
}
他の「グローバル」変数との混乱や間違いを避けるため、変数には特定の名前を使用することをお勧めします。
Configフォルダー内に、以下の内容の "variable.php"などのphpファイル名を作成できます。
<?php return [ 'versionNumber' => '122231', ];
これで、すべてのビュー内でconfig('variable.versionNumber')
を使用してこの変数を呼び出すことができます。
最善の方法はView Composers
を使用することだと思います。誰かがここに来て、View Composersの方法でそれを行う方法を見つけたい場合は、私の答え=> すべてのビューで変数を共有する方法 を読んでください
ドキュメントはこちら https://laravel.com/docs/5.4/views#view-composers しかし、私はそれを分解しますコンテンツ付きの.php
Laravel 5.6メソッド: https://laravel.com/docs/5.6/views#passing-data-to-views
例、すべてのビュー(AppServiceProvider.php)にモデルコレクションを共有する場合:
use Illuminate\Support\Facades\View;
use App\Product;
public function boot()
{
$products = Product::all();
View::share('products', $products);
}