Каков наилучший способ в нижнем регистре, заменить символы маршрута с помощником маршрута laravel? - PullRequest
1 голос
/ 16 октября 2019

Я хочу улучшить генерацию маршрута в моем проекте Laravel. На самом деле меня не устраивает мое решение, и я не на пути к наилучшей практике, потому что я меняю его везде, где генерирую URL. Я думаю, что это неправильно.

Мне нужно сгенерировать URL в моем шаблоне блэйда

  • должен генерировать только строчные URL
  • Я заменю некоторые буквы, такие как ä -> ae
  • парсинг даты

Какая «лучшая практика» для этого?

Спасибо за это.

Я пытался сделатьэто прямо в блейд-файле.

@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

1 Ответ

0 голосов
/ 16 октября 2019

В 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);
}

Этого помощника достаточно для создания URL-адреса, дружественного к SEO, но только для этого ответадо первой и второй точки пули. В остальном я думаю, что лучшим решением будет использование Accessor в вашем Food классе.

Таким образом, когда вы получаете доступ к свойству 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

Для даты необходимо добавить только к этому коду форматированиечасть.

...