Переопределение по умолчанию str_slug - возможно? Laravel -7 - PullRequest
1 голос
/ 22 апреля 2020

У нас есть пользователи из TamilNadu, и похоже, что Laravel по умолчанию Str :: slug () не может обрабатывать символы вроде: தமிழ் . Он просто возвращает пустую строку. Это приводит к 404 на страницах профиля пользователей.

Мне интересно, как я могу решить эту проблему, не затрагивая остальные мои URL. Я думаю, что один из способов исправить это - переопределить стандартную функцию Str :: slug () и проверить, возвращает ли исходная функция пустую строку. Если это так, я мог бы прокомментировать первое поле как $ title = stati c :: 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);
}

Как вы справляетесь с этим в своем приложении ? Спасибо за продвижение ..

1 Ответ

2 голосов
/ 22 апреля 2020

Все возможно, однако я бы не рекомендовал переопределять Laravel помощников.

Удобно, класс Str использует черту Laravel macroable, что позволяет нам легко расширять его.

Я предлагаю написать свой собственный метод Str::superSlug() для обработки слагов на тамильском языке.

Для этого вы можете добавить свой собственный макрос в метод boot() вашего AppServiceProvider:

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(); в любом месте вашего кода.

Вот отличное видео, которое подробно объясняет эту концепцию:

...