2017-01-24 1 views
1

сегментные У меня есть две модели, Thread и Post и отношения (один Thread имеет много Post с) определяется в posts() методов в Thread модели. Thread ы разрешаются через поле Slug:Явная модель связывания с использованием маршрутных имен

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

Теперь каждый Post имеет index поле, начиная с 1 - он идентифицирует положение этого Post в последовательности. Например, в

/threads/some_thread_slug/posts/4 

с определением маршрута будучи

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

4 НЕ идентификатор Post, это индекс Post по отношению к другим Post с с той же thread_id. Другими словами, если Thread с пробкой из some_thread_slug имеет 10 Post с, то выше маршрут должен преобразовываться в Post с index (опять-таки, не id) 4:

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

Цель состоит в том, чтобы сейчас решение Post s через index. Я могу, конечно, настроить его через RouteSerivceProvider, но проблема в том, что у меня нет доступа к родительским Thread Slug:

Route::bind('post', function (int $index) { 
    // Hmmm.. How do I know which Thread this $index relates to? 
    // By no means are these indices unique! 
}); 

Мое решение до сих пор найти родителей Thread путем прямого доступа к компоненту URL (например, some_thread_slug) и выборку соответствующей модели. НО это опасно, потому что индекс в Request::segment() не всегда одинаковый. Предлагает ли Laravel для этого лучшее решение?

ответ

2

Параметр callable метода Route::bind() может принимать второй параметр, являющийся экземпляром класса Illuminate\Routing\Route. Вы можете использовать этот экземпляр, чтобы получить Thread с маршрута parameters.

Пример:

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

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

Спасибо! Я должен был сделать префикс 'Route' следующим образом:' \ Illuminate \ Routing \ Route', с ведущей обратной косой чертой. Работает хорошо! Единственное значение - параметр $ route-> ('thread') 'возвращает' string'. Невозможно автоматически разрешить «Thread» здесь, правильно? – Alex

+1

Существует. Если вы привязываете '{thread}' к экземпляру 'Thread', используя привязку маршрутной модели, он должен корректно разрешаться. –

+0

Удивительный! Спасибо огромное! – Alex