2017-01-24 9 views
1

Iは、2つのモデル、ThreadPost、及び関係(一方Threadは多くPost Sを有する)Threadモデルにおけるposts()方法で定義されています。 Thread Sはスラグのフィールドを介して解決される:明示的なモデル結合による経路セグメント名

// in Thread.php... 
public function getRouteKeyName() 
{ 
    return 'slug'; 
} 

次に、各Post1から出発indexフィールドを有している - それは、配列中のこのPostの位置を特定します。例えば、

Route::get('threads/{thread}/posts/{post}, '.....'); 

4ある経路定義に

/threads/some_thread_slug/posts/4 

PostのIDではない、それは同じthread_id有する他Post Sに関してPostの指標です。 some_thread_slugのスラグとThread次に、上記ルートは(再び、ないid)4のindexPostに解決する必要があり、10のPost Sを有し、言い換えれば、:

// Thread $thread is automatically resolved through the 'slug' field... 
$post = $thread->posts()->where('index', $index)->first() // $post->index == 4 

目標は、今解決することですPostからindexまでです。私は確かにRouteSerivceProviderを通してそれを微調整することができますが、問題は、私は親Threadスラグへのアクセスを持っていないということです。

Route::bind('post', function (int $index) { 
    // Hmmm.. How do I know which Thread this $index relates to? 
    // By no means are these indices unique! 
}); 
私のソリューションは、これまで直接URLコンポーネントにアクセスすることによって、親 Threadを見つけることです

(例えばsome_thread_slug)、対応するモデルをフェッチする。しかし、Request::segment()のインデックスが必ずしも同じではないため、危険です。 Laravelはこれに対してより良い解決策を提供していますか?

答えて

2

Route::bind()メソッドのパラメータは、Illuminate\Routing\Routeクラスのインスタンスである2番目のパラメータを受け入れることができます。そのインスタンスを使用してルートからThreadを取得することができます。

例:

Route::bind('post', function (int $index, Route $route) { 
    $thread = $route->parameter('thread'); 

    return $thread->posts()->where('index', $index)->first(); 
}); 
+0

ありがとう! '\ Illuminate \ Routing \ Route'のように接頭辞' Route'を先頭のバックスラッシュでつけなければなりませんでした。うまくいきます!唯一のことは '$ route-> parameter( 'thread')'は 'string'を返します。ここで 'スレッド'を自動的に解決する方法はありません。 – Alex

+1

あります。 '{thread} 'をルートモデルバインディングを使って' Thread'インスタンスにバインドすると、正しく解決されるはずです。 –

+0

恐ろしい!どうもありがとうございます! – Alex

関連する問題