【问题标题】:How to use both ID and slug in Laravel 4 route URL? (resource/id/slug)如何在 Laravel 4 路由 URL 中同时使用 ID 和 slug? (资源/id/slug)
【发布时间】:2014-10-23 11:19:26
【问题描述】:

我想在我的文章路由中同时使用 ID 和 slug。所以我想要/articles/ID/slug,而不是/articles/ID

我实际上不需要任何 slug 变量;它只是为了使 URL 更具可读性和 SEO,所以我将使用 ID 作为检索文章的标识符。

如果输入了 URL /articles/ID,我想重定向到 /articles/ID/slug/articles/ID/edit 必须有一个例外,因为这会打开用于编辑文章的表单。

我已经用谷歌搜索并查看了这个网站,但我只找到了将 ID 替换为 slug 的示例,而不是两者都包含。

我怎样才能做到这一点?我可以使用URL 类获取文章的完整 URL (/articles/ID/slug) 吗?

当前路线配置:

Route::resource('articles', 'ArticlesController');

【问题讨论】:

  • 我看过那个帖子,他说:“我的目标是继续使用 Numbers 但也使用 Slugs 以获得更好的 SEO URL”。我想同时使用。
  • 它可能仍然非常接近该帖子的第一个答案。在这种情况下,您可能最好不要使用::resource,因为您需要为您的 slug 指定额外的参数。像::controller('articles/{id}/{slug?}', ArticlesController'); 这样的东西可能会成功
  • 谢谢,我试试看。从文档看来,我可以保留::resource 路由:如果您需要在默认资源路由之外向资源控制器添加其他路由,则应在调用 Route:: 之前定义这些路由:资源: stackoverflow.com/questions/16661292/…
  • 那是正确的,取决于你在哪里需要那些蛞蝓;如果只是为了查看它们,那么就可以了。如果您需要在所有 ArticlesController 方法上使用 slug,那么您最终将在 ::resource 之前编写所有 Route 定义,在这种情况下,::controller 是更明显的选择。所以回到你的情况。

标签: php laravel-4 seo


【解决方案1】:

所以,这就是我最终要做的:

routes.php,为showedit 创建了自定义路由。其余部分使用资源:

Route::pattern('id', '[0-9]+');

Route::get('articles/{id}/{slug?}', ['as' => 'articles.show', 'uses' =>   'ArticlesController@show']);
Route::get('articles/edit/{id}', ['as' => 'articles.edit', 'uses' => 'ArticlesController@edit']);
Route::resource('articles', 'ArticlesController', ['except' => ['show', 'edit']]);

控制器,添加了带有默认值的slug 输入参数。如果 slug 丢失或不正确,则重定向请求,因此如果标题更改,它将重定向并返回 HTTP 301(永久移动):

public function show($id, $slug = null)
{
    $post = Article::findOrFail($id);

    if ($slug != Str::slug($post->title))
        return Redirect::route('articles.show', array('id' => $post->id, 'slug' => Str::slug($post->title)), 301);

    return View::make('articles.show', [
        'article' => Article::with('writer')->findOrFail($id)
    ]);
}

查看演示者,我最初在我的模型课上有些东西。但根据此答案将其移至视图演示者类:https://stackoverflow.com/a/25577174/3903565,安装并使用此:https://github.com/laracasts/Presenter

public function url()
{
    return URL::route('articles.show', array('id' => $this->id, 'slug' => Str::slug($this->title)));
}

public function stump()
{
    return Str::limit($this->content, 500);
}

查看,从view presenter那里获取url:

@foreach($articles as $article)
    <article>
        <h3>{{ HTML::link($article->present()->url, $article->title) }} <small>by {{ $article->writer->name }}</small></h3>
        <div class="body">
            <p>{{ $article->present()->stump }}</p>
            <p><a href="{{ $article->present()->url }}"><button type="button" class="btn btn-default btn-sm">Read more...</button></a></p>
        </div>
    </article>
@endforeach

【讨论】:

    猜你喜欢
    • 2014-03-16
    • 1970-01-01
    • 2018-07-26
    • 1970-01-01
    • 2015-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多