Подтвердить что ты не робот

Динамические 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. Любая помощь в этом?

4b9b3361

Ответ 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