2017-05-25 12 views
0

私はアプリは、このようなURL構造のものを使用するパラメータルートグループが自動的にアカウントを選択します。Laravelのルートグループは

Route::group(['middleware' => 'auth', 'prefix' => 'account/{username}'], function() { 
    Route::get('/photos', '[email protected]')->name('photos.index'); 
}); 

上記の例では、I [email protected]の内部{username}パラメータにアクセスすることができます。

アカウント情報を自動的に取得し、グループ内のすべての子ルートからアクセスできるミドルウェアを作成する方法はありますか?または、これを構築しようとするのは悪い方法ですか?

答えて

3

これは、ルートモデルバインドで可能である必要があります。

Route::bind('username', function ($username) { 
    return Account::findByUsername($username); 
}); 

注:上記のコードは、あなたのルートプロバイダーまたはルートグループ自己の中に置くことができます。

完了したら、モデルAccountを最初の引数としてコントローラメソッドに渡します。自動的にそのユーザー名と一致するモデルになります。存在しない場合は404です。

// If {username} is 'bob', the Account object now references Bob's account. 
public function index(Account $account) {} 

See Laravel Docs Here

+0

恐ろしい、よかった – Callum

+0

こんにちはJoeさん、私がビューに自動的に値を解析できるように、これをサービスプロバイダと結びつける方法があるかどうか分かりますか? – Callum

+0

サービスプロバイダでは、しかし、ビューコンポーザーを使用し、コンストラクターの 'Request'オブジェクトで受け入れることができます。次に、リクエストからプロパティを抜き出します( '$ request-> route-> parameters'私は信じますが、100%は確信していません)。個人的には私は「グローバル」変数のファンではないので、おそらくこれをしないでしょう。 – Joe

0

すべてのあなたのコントローラメソッドを取得する前に、操作を実行する必要がある場合は、[はい、要求oはあなたがLaravelのミドルウェアを使用する必要がありますいくつかの一般的なデータを伝播します。それはあなたのロジックを集中化するだけでなく、コントローラコードをきれいにするだけです。

laravelでも時々あなたはそれをしたいと思います。

以前のバージョンのLaravelでは、コントローラのコンストラクタでセッション変数または認証されたユーザーにアクセスできました。これは決してフレームワークの明白な特徴ではありません。 Laravel 5.3では、ミドルウェアがまだ実行されていないため、コントローラのコンストラクタでセッションまたは認証されたユーザにアクセスすることはできません。

代わりに、コントローラのコンストラクタでClosureベースのミドルウェアを直接定義することもできます。この機能を使用する前に、アプリケーションが稼働していることを確認してください。

アカウントの詳細を計算するためのミドルウェアを作成することができます.Laravelバージョン5.3.4以降を使用している場合は、クロージャベースのミドルウェアを使用してコンストラクタのコントローラプロパティに直接割り当てます。このよう

:これは役立つだろう

class ProjectController extends Controller 
{ 
    /** 
    * All of the current user's account details 
    */ 
    protected $accountDetails; 

    /** 
    * Create a new controller instance. 
    * 
    * @return void 
    */ 
    public function __construct() 
    { 
     $this->middleware(function ($request, $next) { 
      $this->accountDetails= Auth::user()->accountDetails; 

      return $next($request); 
     }); 
    } 
} 

希望。

関連する問題