Исправление / расширение маршрута UrlGenerator для переписывания URL для замены всех пробелов на дефисы

У меня есть такие маршруты:

user:
    path: /u/{id}/{name}
    defaults: { _controller: AcmeMyBundle:User:user, name: '' }
    requirements:
        id: '[0-9]+'

{name} нужен только для того, чтобы иметь красивый URL для пользователей и SEO. Я не использую {name} ни для чего в своем приложении, потому что {id} выполняет всю работу. {name} обычно состоит из нескольких слов (имя + фамилия и т. д.), а сгенерированные URL-адреса выглядят следующим образом:

http://my.project/u/12/Firstname%20LastName

Я генерирую URL-адрес либо в шаблоне веточки с путем ('user', {id: user_id, name: user_name}) или в php с помощью $ this-> get ('router') -> generate (...)

Я бы не хотел использовать% 20 ​​и заменять все пробелы дефисами, чтобы ссылки выглядели так:

http://my.project/u/12/Firstname-LastName

Это выглядит более читабельным и я где-то читал, что гуглу нравятся дефисы больше ...

Лучше всего, если бы генератор маршрутов делал это. Просто замените все пробелы дефисами. В данный момент мне больше ничего не нужно, и это не может ни на что повлиять, потому что {name} или некоторые другие описательные параметры используются только для SEO и не используются в приложении. {id} - важный параметр

Мне не удалось найти способ сделать это красиво по какому-то параметру, поэтому я просто открыл vendor / symfony / symfony / src / Symfony / Component / Routing / Generator / UrlGenerator.php и добавил "% 20 "и пробел перед decodedChars:

protected $decodedChars = array(
    # ...
    '%2A' => '*',
    '%7C' => '|',
    # replace spaces with hyphen
    '%20' => '-',
    ' '   => '-' 
);

Это работает, но я не очень хорошо себя чувствую с этим решением, потому что я исправляю ядро ​​Symfony. А позже я, возможно, захочу ввести {имя} в нижний регистр или другие параметры по умолчанию.

Есть ли способ лучше? Я бы подумал, что лучший способ администрирования таких вещей - это определить некоторые параметры postSlugify в routing.yml ...

Я мог бы сделать функции getName () и getNameSluggified () в моем объекте User и что-то подобное в других объектах, но должен быть способ автоматизировать это, не создавая n подобных функций в каждом объекте.


person user0001    schedule 06.06.2014    source источник
comment
Вам следует подумать об использовании расширения Doctrine Sluggable;)   -  person Rybus    schedule 06.06.2014
comment
@Kanalkyte;). спасибо, работает неплохо. что мне не нравится, так это то, что это заставляет меня делать столбец-слаг в сущности. нет возможности создавать пули вживую. и если я позже добавлю еще один столбец в slug, slug останется таким же. я прав?   -  person user0001    schedule 07.06.2014
comment
Заголовки могут состоять из нескольких столбцов :) Таким образом, вы можете обновлять ярлыки (просто используйте findAll() и persist() + flush(), чтобы обновить все ярлыки за один раз!) Я сделал небольшой командный скрипт, чтобы сделать это за меня. Не знаю, есть ли более простой способ сделать это: /   -  person Rybus    schedule 07.06.2014
comment
я думал об этом, но слаг не меняется, пока значение столбца не изменилось. Мне пришлось дважды запустить persist / flush, 1-й раз, чтобы перезаписать столбец, 2-й раз, чтобы установить реальное значение.   -  person user0001    schedule 08.06.2014


Ответы (1)


Вот полный ответ, поскольку это сработало для вас:

Вы можете использовать расширение Doctrine Sluggable:

 class Foo
 {
     // your attributes
     // in the folowing "fields", you cas use several fields
    /**
    * @Gedmo\Slug(fields={"name", "bar"})
    * @ODM\String
    */
     private $slug;

  // some stuff
}

Если вы измените атрибут field, вам нужно будет обновить заголовки. Вот тема, которую я нашел об обновлении слагов.

Вы можете реализовать это в инструменте командной строки, используя эту страницу документации.

person Rybus    schedule 06.06.2014