2016-07-05 6 views
1

У меня есть поле EntityType в форме:Фильтр EntityType владельца/текущий пользователь

$builder->add('site') 

теперь все сайты отображаются в выпадающем списке, но я хочу, чтобы показать только те, которые относятся к текущему пользователю ,

Логики приложения является то, что есть много пользователей, каждый из них может управлять только своими собственными сайтами (сайт :: пользователя является @ORM\ManyToOne(targetEntity="User", inversedBy="sites"))

Я знаю, что можешь использовать query_builder - но то, что это лучший способ чтобы получить текущего пользователя в форме?

ответ

2

Чтобы получить текущий пользовательский объект (или идентификатор) в форме, существует несколько способов. Можно было бы установить его с помощью опции формы в

$form = $this->createForm(MyFormType::class, $obj, [ 
    'user' => $this->getUser(), 
]); 

и включите опцию со значением по умолчанию null как так.

class MyFormType extends AbstractType 
{ 

    public function configureOptions(OptionsResolver $resolver) 
    { 
      $resolver->setDefaults([ 
        'data_class' => '...', 
        'user' => null, 
      ]); 
    } 

Теперь вы можете использовать $options['user'] в buildForm() (убедитесь, чтобы проверить, если это null или нет перед использованием).


Но так вы всегда должны вводить пользователя самостоятельно - почему бы не позволить Symfony позаботиться об этом? Во-первых, зарегистрировать свою форму в качестве службы в services.yml как так

app.form.myform: 
    class: AppBundle\Form\MyFormType 
    arguments: ["@security.token_storage"] 
    tags: 
     - { name: form.type } 

Вы видите, я уже добавил еще одну вещь: @security.token_storage аргумент. Теперь в форму, добавить конструктор

use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface; 

class MyFormType extends AbstractType 
{ 

    protected $tokenStorage; 

    public function __construct(TokenStorageInterface $tokenStorage) 
    { 
      $this->tokenStorage = $tokenStorage; 
    } 

и извлечения пользователя в buildForm() теперь будет так же легко, как

$user = $this->tokenStorage->getToken()->getUser(); 
+0

Спасибо. С первым решением я получил «Пользователь», «Пользователь» не существует. ». Я добавил пользователя как свойство $ obj ('$ obj-> user = $ this-> getUser()' перед вызовом createForm) –

+1

@the_nuts Я обновил свой ответ, конечно, вам нужно включить опцию способный использовать его. – kero

Смежные вопросы