2016-03-10 4 views
0

В проекте симфони, у меня есть шаблон URL, как этотMapping пробкового с записью базы данных

/resource/{id} 

я могу преобразовать это sluggified URL, как

/resource/{slug} 

с использованием документации, приведенной в symfony webiste.

Но, я еще не знаю, как это сделать {slug} к записи в базе данных. Есть ли какой-либо стандартный способ сделать это, кроме создания переменной slug в классе сущности и сохранения ее в базе данных, а затем получения записи с использованием этого свойства?

UPDATE

Я не знаю, как Symfony является извлечение данных из базы данных. Мое действие выглядит следующим образом.

/** 
* Finds and displays a Resource entity. 
* 
* @Route("/{slug}", name="resource_show") 
* @Method("GET") 
*/ 
public function showAction(Resource $resource) 
{ 
    $deleteForm = $this->createDeleteForm($resource); 
    return $this->render('resource/show.html.twig', array(
     'resource' => $resource, 
     'delete_form' => $deleteForm->createView(), 
    )); 
} 

Я только что заменил id с slug в контроллере после внесения изменений в соответствующие ResourceEntity. Теперь Symfony автоматически извлечения информации из базы данных с помощью slug и передается showAction метод ..

ответ

2

Что вы упомянули это правильно, вы должны сгенерировать уникальный Slug из строки (Ex: Post Title), храните его в БД, и найти Entity по Slug

Пример:

$obj = $repository->findOneBySlug('test-post'); 

, если вы хотите, чтобы сделать процесс создания простой Slug и используя хорошо испытанный библиотеку, вы можете использовать Sluggable behavior extension for Doctrine.

+0

Что такое 'findBySlug' в вашем сегменте кода? Это что-то автогенерированное symfony? Или создать настраиваемый метод? – niyasc

+0

@niyasc Doctrine предоставляет findOneBy *() findBy *(), где вы можете заменить * действительным свойством (имя столбца) – Vamsi

1

Все, что вам нужно сделать, это использовать Synmfony ParameterConvereter.

Здесь как shold выглядеть следующим образом:

Допустим, у вас есть User сущность. Обратите внимание на поле slug.

/** 
* Class User 
* 
* @package AppBundle\Entity 
* 
* @ORM\Entity 
* @Gedmo\Loggable 
*/ 
class User extends BaseUser implements Translatable 
{ 
    /** 
    * @var $id 
    * 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="UUID") 
    * @ORM\Column(type="guid") 
    * 
    */ 
    protected $id; 

    /** 
    * @var 
    * @Gedmo\Translatable 
    * @Gedmo\Versioned 
    * @ORM\Column(type="string")) 
    */ 
    protected $username; 
    /** 
    * @var 
    * 
    * @ORM\Column(type="string")) 
    */ 
    protected $firstName; 

    /** 
    * @var 
    * 
    * @ORM\Column(type="string")) 
    */ 
    protected $lastName; 

    /** 
    * @Gedmo\Slug(fields={"firstName"}, style="camel", updatable=false, separator="-") 
    * @ORM\Column(length=128, unique=true) 
    */ 
    private $slug; 

    /** 
    * @Gedmo\Locale 
    * Used locale to override Translation listener`s locale 
    * this is not a mapped field of entity metadata, just a simple property 
    */ 
    private $locale; 

// ... 

Таким образом, на маршруте вместо идентификатора вы будете иметь имя пользователя.

Тогда в контроллере все, что вам нужно сделать, это:

/** 
    * @param User $user 
    * @param Request $request 
    * 
    * @return array 
    * 
    * @Route(path="/edit/{slug}", name="trans_edit") 
    * @ParamConverter("user", class="AppBundle:User", options={"slug" = "slug"}) 

    * @Template() 
    */ 
    public function editAction(User $user, Request $request) 
    { 
     dump($user); 
    } 

// ... 

Slug автоматически преобразуется в User объект. Нет необходимости вручную вызывать БД, ParameterConvereter сделает это автоматически.