在Laravel中动态生成URL

时间:2014-11-20 10:56:54

标签: php laravel laravel-4 laravel-routing

我正在使用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

1 个答案:

答案 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()上调用它即可生成网址