laravel创建自定义URL结构

时间:2018-06-18 06:33:48

标签: php laravel laravel-5 laravel-5.5

我的laravel路线有问题。

我在php中有一个旧商店,我在laravel中重写它。问题在于产品路线。它们已被索引(谷歌),现在我无法访问它们。

网址结构是:

http://mydomain/product/{productName}-{productID}.html

在laravel中,我创建了一条生成相同结构的路线:

Route::get('/product/{productName}-{id}.html', 'ProductController@index')->name('product');

问题是,当旧网址在productName中包含点(。)时,它返回404(不会进入控制器) - 因为新路由中的(.html)。

如果从路径中删除(.html)我在控制器中获取请求,但是如何才能更好地创建URL的结构?

/{productName}-{productID}.html

更新

生成productName时,我使用php函数使其成为seo(productName):

public function makeSeoLink($string)
{
    // trim the string
    $string = trim($string);

    // remove all diacritics
    $string = str_ireplace(array("â", "î", "ă", "ș", "ț"), array("a", "i", "a", "s", "t"), $string);

    // remove all non alphanumeric characters except spaces
    $clean =  preg_replace('/[^a-zA-Z0-9\s]/', '', strtolower($string));

    // replace one or multiple spaces into single dash (-)
    $clean =  preg_replace('!\s+!', '-', $clean);

    return $clean;
}
生成网址时

route('product', array(makeSeoLink($p->Name), $p->id));

2 个答案:

答案 0 :(得分:0)

对于Laravel,路由有一个where子句。所以你可以添加一个扩展名,并在where子句中指定它。这是一个例子。

Route::get('/product/{productName}-{id}{extension}', 'ProductController@index')->name('product')->where('extension', '(?:.html)?');

我从here得到了这个答案。

其他有用的链接

https://stackoverflow.com/a/22289143/6261137

https://stackoverflow.com/a/33827159/6261137

答案 1 :(得分:0)

由于产品名称可以包含破折号( - ),您必须使用以下内容:

<强>路线

Route::get('/product/{productDetails}','ProductController@index')->name('product');

索引功能

function index(){
    $segment = Request::segment(2);
    $segment = str_replace('.html', '', $segment);
    $list =  explode('-',$segment);
    $id = end($list);
    array_pop($list);
    $text = implode("-",$list);
    return [$id,$text];
}