2014-08-29 16 views
9

Tôi muốn sử dụng cả ID và slug trong tuyến đường bài viết của mình. Vì vậy, thay vì /articles/ID Tôi muốn /articles/ID/slug.Làm thế nào để sử dụng cả ID và slug trong URL của Laravel 4? (tài nguyên/id/slug)

Tôi không thực sự cần biến sên cho bất kỳ thứ gì; nó chỉ ở đó để làm cho URL dễ đọc hơn và SEO, vì vậy tôi sẽ sử dụng ID làm định danh để truy xuất các bài viết.

Nếu URL /articles/ID được nhập, tôi muốn chuyển hướng đến /articles/ID/slug. Phải có ngoại lệ cho /articles/ID/edit vì thao tác này sẽ mở biểu mẫu để chỉnh sửa bài viết.

Tôi đã googled và xem trang web này, nhưng tôi chỉ tìm thấy ví dụ về thay thế ID bằng sên, không bao gồm cả hai.

Tôi làm cách nào để đạt được điều này? Và tôi có thể sử dụng lớp học URL để nhận URL đầy đủ (/articles/ID/slug) cho một bài viết không?

hiện tại tuyến đường config:

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

http: // stackoverflow.com/questions/21949298/how-to-add-slug-and-id-url-to-laravel-4-route – JofryHS

+0

Tôi đã xem bài đăng đó và anh ấy nói: "Mục tiêu của tôi là tiếp tục sử dụng Số * * mà còn sử dụng Slugs ** cho URL tốt hơn của SEO ". Tôi muốn sử dụng cả hai. –

+1

Nó có lẽ vẫn sẽ rất gần với câu trả lời đầu tiên cho bài đăng đó. Trong trường hợp này, bạn có thể sẽ là tốt nhất mà không có ':: resource', vì bạn cần chỉ định tham số bổ sung cho slug của bạn. Một cái gì đó như ':: điều khiển ('bài viết/{id}/{slug?}', ArticlesController ');' có thể làm các trick – JofryHS

Trả lời

9

Vì vậy, đây là những gì tôi đã kết thúc thực hiện:

routes.php, tạo ra một lộ trình tùy chỉnh cho showedit. Đã sử dụng tài nguyên cho phần còn lại:

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

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

Bộ điều khiển, thêm slug thông số đầu vào với giá trị mặc định. Chuyển hướng yêu cầu nếu sên bị thiếu hoặc không chính xác, vì vậy nó sẽ chuyển hướng nếu tiêu đề được thay đổi và trả về một HTTP 301 (vĩnh viễn chuyển):

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) 
    ]); 
} 

Xem người dẫn chương trình, tôi ban đầu đã có một cái gì đó trong lớp mô hình của tôi. Nhưng di chuyển nó vào một lớp học xem người dẫn chương trình trên cơ sở câu trả lời này: https://stackoverflow.com/a/25577174/3903565, cài đặt và sử dụng này: 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, lấy url từ người dẫn chương trình xem:

@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 
Các vấn đề liên quan