Динамические URL-адреса в laravel?
Я смотрю переход на laravel для моего следующего проекта.
Мой следующий проект, вероятно, будет небольшим сайтом с несколькими статическими страницами, блогом и менеджером проектов и будет использовать контроллеры, а не маршруты.
Мне интересно, как я могу управлять динамическими маршрутами в Laravel.
В принципе, я хочу создать раздел администрирования, чтобы я мог легко создавать статические страницы "на лету", а на статических страницах будут ориентироваться SEO-ориентированные URL-адреса. http://domain.com/when-it-started Я не хочу создавать новый контроллер или маршрут вручную для каждой страницы.
Так что мне интересно, какой самый чистый способ справиться с этим.
по существу все статические страницы собираются обмениваться одним и тем же представлением, а только несколько переменных, которые нужно изменить.
Динамическая маршрутизация должна работать с контроллерами не вместо.
например. если у нас есть контроллер about
с функцией staff
, то это должно быть загружено через http://domain.com/about/staff
но мы не имеем функцию players
, поэтому вызов http://domain.com/about/players должен проверить базу данных, чтобы увидеть, существует ли динамический маршрут и матчей. Если он отображает это, в противном случае отобразите страницу 404. Аналогично для несуществующего контроллера. (например, не было бы контроллера when-it-started
!)
Выбранный ответ, похоже, не работает в Laravel 4. Любая помощь в этом?
Ответы
Ответ 1
Для Laravel 4 сделайте это
Route::get('{slug}', function($slug) {
$page = Page::where('slug', '=', $slug)->first();
if ( is_null($page) )
// use either one of the two lines below. I prefer the second now
// return Event::first('404');
App::abort(404);
return View::make('pages.show', array('page' => $page));
});
// for controllers and views
Route::get('{page}', array('as' => 'pages.show', 'uses' => '[email protected]'));
Ответ 2
Вы можете использовать групповые шаблоны маршрута для задания, вы можете начать с (:any)
, и если вам нужно несколько сегментов URL добавить необязательный (:all?)
, а затем идентифицировать страницу из пули.
Например:
Route::get('(:any)', function($slug) {
$page = Page::where_slug($slug)->first();
if ( is_null($page) )
return Event::first('404');
return View::make('page')->with($page);
});
Ответ 3
Очень похоже на ответ Чарльза, но в контроллере:
public function showBySlug($slug) {
$post = Post::where('slug','=',$slug)->first();
// would use app/posts/show.blade.php
return View::make('posts.show')->with(array(
'post' => $post,
));
}
Затем вы можете направить его так:
Route::get('post/{slug}', '[email protected]')
->where('slug', '[\-_A-Za-z]+');`
..., который имеет дополнительный бонус, позволяющий вам легко связать прямо с маршрутами пули на индексной странице, например:
@foreach ($posts as $post)
<h2>{{ HTML::link(
action('[email protected]', array($post->slug)),
$post->title
)}}</h2>
@endforeach