我正在使用Laravel 4进行新项目,这是一个新闻网站。
单篇文章的网址应如下所示:
domain.com/ {类别} / {SHORTURL} / {ID}
(例如“domain.com/sports/realmadrid-barcelona/15”)
在我的routes.php文件中,我声明了:
Route::get('{cat}/{shorturl}/{id}', 'ArticlesController@view');
工作正常。
现在我需要做的就是使用单个Article(模型)实例作为参数传递给Controller动作以生成URL / Route。这意味着,我想传递Article实例,而不是传递所有三个参数('cat','shorturl'和'id')。
为了解决这个问题,我到目前为止所做的是:
在routes.php中:
Route::model('article', 'Article');
Route::get('{cat}/{shorturl}/{id}', 'ArticlesController@view');
Route::get('article/{article}', 'ArticlesController@generateUrl');
在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('ArticlesController@view', array('cat' => $cat, 'shorturl' => $shorturl, 'id' => $id));
}
通过这样做,在我的视图文件中,我有类似的东西来生成其他文章的链接:
<a href="{{ action('ArticlesController@generateUrl', $otherarticle) }}">{{ $otherarticle->title }}</a>
问题在于,虽然重定向有效,但实际的URL(鼠标悬停时显示的URL)是'原始'(这意味着:“domain.com/article/123”)而不是预期的(“ domain.com/sports/realmadrid-barcelona/123" )。
关于如何实现这一目标的任何想法?我想只使用$ article(Article模型实例)来生成URL,以使代码尽可能简单和干净。
谢谢你, ILIAS
答案 0 :(得分:2)
您需要立即生成真正的网址,而不是使用重定向 我会将此方法添加到您的模型类
class Article extends Eloquent {
public function getUrl(){
$cat = $this->category()->pluck('text');
$shorturl = $this->urltext;
$id = $this->id;
return URL::action('ArticlesController@view', array('cat' => $cat, 'shorturl' => $shorturl, 'id' => $id));
}
}
然后只需在文章对象$article->getUrl()
上调用它即可生成网址