2016-10-19 7 views
0

Так у меня есть класс опрос со значением CreatedBy (идентификатор пользователя от лица, подавшего его), то контроллер, в котором перечислены все опросы в таблице опросаSymfony 3 - лучшая практика для поиска ID

public function indexAction() 
{ 
    $entityManager = $this->getDoctrine()->getManager(); 
    $posts = $entityManager->getRepository(Poll::class)->findBy([], ['createdDate' => 'DESC']); 

    return $this->render('poll/admin/index.html.twig', ['posts' => $posts]); 
} 

Мой шаблон прут выглядит немного как это на momemt

 <tbody> 
    {% for poll in posts %} 
     <tr id="poll_{{ poll.id }}"> 
      <td> {{ poll.title }}</td> 
      <td>{{ poll.createdBy }}</td> 
      <td>etc</td> 
      <td>etc</td> 
      <td>etc</td> 
     </tr> 
    {% endfor %} 
    </tbody> 

Если я хочу, чтобы отобразить фактическое имя пользователя вместо CreatedBy ID, что было бы наилучшей практикой? Я использую FOSUserBundle

+0

есть отношение (от одного до многих, например) между вашим пользователем и классами опроса? если это так, вы можете использовать его непосредственно в шаблоне twig – wlalele

+0

Нет, пользователи разделены и в основном обрабатываются fosuserbundle (у меня есть собственный класс пользователя с несколькими дополнительными переменными и событие, которое прослушивает назначение роли, когда они подтверждают свою электронную почту) Я знаю, что могу добавить функцию в свой класс опроса, но что-то в этом не так, особенно если у fosuserbundle есть findUserBy - я просто не уверен, как его использовать – p3tch

+0

Чтобы использовать findUserBy, вам просто нужно пройти ваши аргументы следующим образом: $ user_manager = $ this-> get ('fos_user.user_manager'); $ my_user = $ user_manager-> findUserBy (массив ('id' => '123')); Но я бы установил связь между Пользователем и Опросом (http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/association-mapping.html), поскольку Пользователь является «submitter/contributor/участник» опроса И тогда, когда у вас есть многого рода или другого типа отношения, вам просто нужно вызвать ассоциацию, как вы ее создали: {{poll.submitter}} – wlalele

ответ

1

Создайте простое расширение ветки, которое преобразует целое число в объект пользователя. Очевидно, он делает это, обращаясь к БД в фоновом режиме, следовательно, включите второй уровень кэша доктрины (при условии, что вы используете Doctrine), чтобы каждый раз не ударять БД для пользовательского объекта. Это также поможет в контроллере, когда вы звоните $ this-> GetUser()

Пример Twig Extension

<?php 

namespace AppBundle\Twig; 

use Twig_Extension; 
use Twig_SimpleFilter; 
use Doctrine\ORM\EntityManager; 
use JMS\DiExtraBundle\Annotation\Tag; 
use JMS\DiExtraBundle\Annotation\Inject; 
use JMS\DiExtraBundle\Annotation\InjectParams; 
use JMS\DiExtraBundle\Annotation\Service; 

/** 
* @Service("app.twig_extension_hydrate_user" , public=false) 
* @Tag("twig.extension") 
*/ 
class HydrateUserExtension extends Twig_Extension 
{ 
    protected $em; 

    /** 
    * @InjectParams({ 
    *  "em" = @Inject("doctrine.orm.entity_manager") 
    * }) 
    */ 
    public function __construct(EntityManager $em) 
    { 
     $this->em = $em; 
    } 

    /** 
    * @inheritdoc 
    */ 
    public function getName() 
    { 
     return 'hydrate_user_extension'; 
    } 

    public function getFilters() 
    { 
     return array(
      new Twig_SimpleFilter('hydrateUser', array($this, 'hydrateUserFilter')), 
     ); 
    } 

    public function hydrateUserFilter($user_id) 
    { 
     $em = $this->em; 
     $user = $em 
      ->getRepository('AppBundle:Users') 
      ->queryUserById($user_id); 
     return $user; 
    } 

} 

Затем в Twig шаблоне, как в вашем примере

<tbody> 
{% for poll in posts %} 
<tr id="poll_{{ poll.id }}"> 
    <td> {{ poll.title }}</td> 
    <td>{{ poll.createdBy|hydrateUser.username }}</td> 
    <td>etc</td> 
    <td>etc</td> 
    <td>etc</td> 
</tr> 
{% endfor %} 
</tbody> 

PS: Убедитесь, что ваш кеш очищен даже в dev env, чтобы обеспечить работу кода!

+0

Спасибо, это как раз то, что я хотел! Дайте twig расширениям сегодня вечером – p3tch

+0

Прохладный, просто комментарий, если вам нужна дальнейшая помощь, чтобы заставить его работать, обратите внимание, что, хотя код выше работает, для него требуется JMSDiExtraBundle для аннотирования сервисов из PHP-файлов, а не из config/services.yml. Cheers. –