覆盖默认 str_slug - 可能吗? Laravel-7

Overriding default str_slug - possible? Laravel-7

我们有来自泰米尔纳德邦的用户,看起来 Laravel 的默认 Str::slug() 无法处理以下字符:தமிழ்。它只是 returns 一个空字符串。这会导致用户个人资料页面出现 404。

我想知道如何在不影响其余 URL 的情况下解决此问题。我认为解决此问题的一种方法是覆盖默认的 Str::slug() 函数并检查原始函数 returns 是否为空字符串。如果是这样,我可以将第一个字段评论为 $title = static::ascii($title)。然后它的作品。但我不想打扰默认的 Str::slug() 方法。同时不知道如何覆盖它。

默认Str::slug():

public static function slug($title, $separator = '-')
{
  //$title = static::ascii($title);

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

  // Remove all characters that are not the separator, letters, numbers, or whitespace.
  $title = preg_replace('![^'.preg_quote($separator).'\pL\pN\s]+!u', '', mb_strtolower($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);
}

您如何在您的应用中处理此问题? 感谢提前..

一切皆有可能,但我不建议重写 Laravel 助手。

方便的是,Str class 使用 Laravel macroable 特性,让我们可以轻松扩展它。

我建议编写您自己的 Str::superSlug() 方法来处理泰米尔语中的 slug。

为此,您可以将自定义宏添加到 AppServiceProvider:

boot() 方法中
public function boot()
{
    Str::macro('superSlug', function ($title) {
        $slugified = Str::slug($title);

        if ($slugified) {
            return $slugified;
        } else {
            // Your code to handle TamilNadu slugs
        }
    });
}

就是这样!您现在可以在代码中的任何位置调用 Str::superSlug(); 方法。

这是一个详细解释这个概念的精彩视频: