什么是小写,用路由 laravel 助手替换字符路由的最佳方法?

What is the best way to lowercase, replace characters route with the route laravel helper?

我想改进路由生成。其实我对自己的解决方案并不满意,也不在最佳实践路径上。

我需要在 blade 中生成一些路由。

那是什么 "best practice"?

我尝试直接在 blade 文件中进行。

@foreach($foods as $food)
            <a href="{{route('food.show', [
            'name' => $food->name,
            'date' => App\Models\Food::replaceCharacters(Str::lower(Carbon\Carbon::parse($food->urlDate)->isoFormat('DD-MMMM-YYYY')))])}}">
              Linkname}}
            </a>
@endforeach

Laravel 有一些本地助手可以帮助您实现这个目标。主要是Str::slug方法。

这是它的源代码:

/**
 * Generate a URL friendly "slug" from a given string.
 *
 * @param  string  $title
 * @param  string  $separator
 * @param  string|null  $language
 * @return string
 */
public static function slug($title, $separator = '-', $language = 'en')
{
    $title = $language ? static::ascii($title, $language) : $title;

    // Convert all dashes/underscores into separator
    $flip = $separator === '-' ? '_' : '-';
    $title = preg_replace('!['.preg_quote($flip).']+!u', $separator, $title);

    // Replace @ with the word 'at'
    $title = str_replace('@', $separator.'at'.$separator, $title);

    // Remove all characters that are not the separator, letters, numbers, or whitespace.
    $title = preg_replace('![^'.preg_quote($separator).'\pL\pN\s]+!u', '', static::lower($title));

    // Replace all separator characters and whitespace by a single separator
    $title = preg_replace('!['.preg_quote($separator).'\s]+!u', $separator, $title);

    return trim($title, $separator);
}

此助手足以生成 SEO 友好 URL,但此答案仅针对第一个和第二个要点。对于其余部分,我认为最好的解决方案是在 Food class.

中使用 Accessor

这样,当您访问 name 属性 或 urlDate 属性 时,您可以收到一个已经格式化的字符串。例如:

use Illuminate\Support\Str;

[...]

public function getNameAttribute($value) 
{
   // Return the slug for a SEO friendly parameter
   return Str::slug($value);
}

示例输入:My äwe$oMe food|name

示例输出:my-aweome-foodname

对于日期,您只应在此代码中添加格式部分。