web-dev-qa-db-ja.com

Laravel 5のすべてのビューにデータを渡す方法は?

Laravel 5アプリケーションのすべてのビューで、いくつかのデフォルトデータにアクセスできるようにします。

私はそれを検索しようとしましたが、Laravel 4の結果のみを見つけました。ドキュメント「すべてのビューでデータを共有する」 ここ を読みましたが、どうすればよいかわかりません。次のコードはどこに配置する必要がありますか?

View::share('data', [1, 2, 3]);

ご協力いただきありがとうございます。

101
Ragnarsson

この目標はさまざまな方法で達成できますが、

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。ミドルウェアの使用

middlewareView::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");
    }
}

参照

Laravelドキュメント

さらに明確にするために Laracast Episode

それでもわからないことがある場合はお知らせください。

175
Safoor Safdar

独自の サービスプロバイダーViewServiceProvider名が一般的)を作成するか、既存のAppServiceProviderを使用できます。

選択したプロバイダーで、ブートメソッドにコードを配置します。

public function boot() {
    view()->share('data', [1, 2, 3]);
}

これにより、すべてのビューで$data変数にアクセスできるようになります。

ヘルパーの代わりにファサードを使用する場合は、view()->View::に変更しますが、ファイルの先頭にuse View;を忘れないでください

56
Marwelln

これが一番簡単だと思いました。新しいプロバイダーを作成し、'*'ワイルドカードを使用して、すべてのビューにアタッチします。 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()
    {
        //
    }
}
8
Stan Smulders

最良の方法は、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_i1000回処理されます。
  • 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に変更するか、ビュー共有ミドルウェアをパイプラインの最後に配置できます。

7
Reza Shadman

ドキュメントは聞く https://laravel.com/docs/5.4/views#view-composers しかし、私はそれを分解します

  1. アプリケーションのルートディレクトリでディレクトリ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()
        {
            //
        }
    }
    
  2. アプリケーションのルートから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'
 );
  1. アプリケーションを更新すると、クラス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'
);
3

ドキュメント内:

通常、サービスプロバイダーのブートメソッド内でshareメソッドを呼び出します。 AppServiceProviderに自由に追加したり、個別のサービスプロバイダーを生成してそれらを格納したりできます。

私はMarwellnに同意します、単にブート関数のAppServiceProviderに入れてください:

public function boot() {
    View::share('youVarName', [1, 2, 3]);
}

他の「グローバル」変数との混乱や間違いを避けるため、変数には特定の名前を使用することをお勧めします。

Configフォルダー内に、以下の内容の "variable.php"などのphpファイル名を作成できます。

<?php return [ 'versionNumber' => '122231', ];

これで、すべてのビュー内でconfig('variable.versionNumber')を使用してこの変数を呼び出すことができます。

1
Mehran

最善の方法はView Composersを使用することだと思います。誰かがここに来て、View Composersの方法でそれを行う方法を見つけたい場合は、私の答え=> すべてのビューで変数を共有する方法 を読んでください

ドキュメントはこちら https://laravel.com/docs/5.4/views#view-composers しかし、私はそれを分解しますコンテンツ付きの.php

1

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);

}
0
Alexander Kim