2014-11-20 9 views
2

Я использую Laravel 4 для нового проекта, который является новостным сайтом.Динамически генерировать URL-адрес в Laravel

URL-адрес для одной статьи должен быть таким:

domain.com/{category}/{shorturl}/{id}

(например, «domain.com/ спорт/Realmadrid-барселона/15")

В моем routes.php файл я заявил:

Route::get('{cat}/{shorturl}/{id}', '[email protected]'); 

, который работает нормально.

Теперь все, что мне нужно сделать, это использовать один экземпляр статьи (модели) для передачи в качестве параметра в действии контроллера для создания URL/маршрута. Это означает, что вместо передачи всех трех параметров («cat», «shorturl» и «id») я хотел бы передать экземпляр статьи.

Чтобы справиться с этим, что я сделал до сих пор является следующее:

В routes.php:

Route::model('article', 'Article'); 

Route::get('{cat}/{shorturl}/{id}', '[email protected]'); 
Route::get('article/{article}', '[email protected]'); 

В ArticlesController.php:

public function view($cat, $urltext, $id) 
{ 
    $article = Article::findOrFail($id); 
    return View::make('articleView', compact(array('article'))); 
} 

public function generateUrl(Article $article) 
{ 
    $cat = $article->category()->pluck('text'); 
    $shorturl = $article->urltext; 
    $id = $article->id; 

    return Redirect::action('[email protected]', array('cat' => $cat, 'shorturl' => $shorturl, 'id' => $id)); 
} 

Делая это, в мой файл просмотра У меня есть что-то вроде этого для создания ссылок на другие статьи:

<a href="{{ action('[email protected]', $otherarticle) }}">{{ $otherarticle->title }}</a> 

Проблема заключается в том, что, хотя перенаправление работает, фактический URL-адрес (тот, который отображается при наведении мыши) является «оригинальным» (это означает: «domain.com/article/123») вместо предполагаемого (" domain.com/sports/realmadrid-barcelona/123").

Любые идеи о том, как это сделать? Я бы хотел использовать только $ article (экземпляр модели статьи) для создания URL-адресов, чтобы код был как можно более простым и чистым.

Спасибо, Илиас

ответ

2

Вместо того, чтобы использовать редирект вам нужно создать реальный URL сразу.
Я хотел бы добавить этот метод для вашей модели класса

class Article extends Eloquent { 

    public function getUrl(){ 
     $cat = $this->category()->pluck('text'); 
     $shorturl = $this->urltext; 
     $id = $this->id; 

     return URL::action('[email protected]', array('cat' => $cat, 'shorturl' => $shorturl, 'id' => $id)); 
    } 

} 

А потом просто вызвать его на объект статьи $article->getUrl() генерировать URL-адрес

+0

это работает, спасибо. –

Смежные вопросы