2015-02-27 4 views
0

Когда форма отправлена, метод набора объектов (Лига # setInformation) вызывается с соответствующими данными. Все работает правильно. (См. Приведенный ниже код в качестве примера)Как ввести параметр в заданный метод в форме submit?

Мне нужно передать дополнительные параметры setInformation, а именно текущий идентификатор пользователя, который хранится в данных сеанса.

Этот трюк поможет сохранить сеанс и модель отдельно. Может быть, полезно и в разных ситуациях.

Знаете ли вы способ справиться с этим?

class LeagueFormType extends AbstractType { 

    public function buildForm(FormBuilderInterface $builder, array $options) { 

     $builder->add('name'); 

     $builder->add('information', 'collection', [ 
      'type' => new LeagueInformationFormType(), 
     ]); 
    } 

    public function setDefaultOptions(\Symfony\Component\OptionsResolver\OptionsResolverInterface $resolver) { 
     $resolver->setDefaults([ 
      'data_class' => 'xxx\Models\League', 
     ]); 
    } 

    public function getName() { 
     return 'league'; 
    } 

} 

class League { 

    public function getInformation() { 
     //... 
    } 

    public function setInformation($data) { 
     ... 
    } 

} 

ответ

0

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

+0

Спасибо за указания, я посмотрю, что я могу сделать с формой в качестве сервиса. –

0

Если вы используете Doctrine2, а класс Лиги - это объект Doctrine2, я бы рекомендовал использовать подписчика/слушателя Doctrine2.

Вы можете настроить подписчика/слушателя на выполнение чего-либо непосредственно перед отправкой данных в базу данных (onFlush), сразу после того, как сообщают доктрину о новом объекте (сохраняются) или непосредственно перед обновлением существующей записи (обновления), в зависимости от того, является наиболее подходящим в вашем случае.

Внесите SecurityContext (@ security.context в DIC) в абонент/слушатель, чтобы извлечь текущую пользовательскую информацию. (Убедитесь, что вы проверили, есть ли у пользователя, потому что абонент также будет запущен, когда никто не войдет в систему, и объект Лиги не будет сохранен)

Главное преимущество этого заключается в том, что это не загрязняет вашу форму или контроллер. И если по какой-то причине вы создаете объект Лиги каким-либо другим способом, текущий пользователь также будет установлен.

Некоторые документы: http://doctrine-orm.readthedocs.org/en/latest/reference/events.html

Это другая история, если вы не используете Doctrine2 хотя.

+0

См. Также этот ответ: http://stackoverflow.com/questions/28421153/symfony2-get-security-context-inside-entity-class/28432590#28432590 – DoppyNL

+0

Я использую silex и doctrine dbal, поэтому нет доступных функций ORM , Проект сложный, мне нужна столько свободы, сколько я могу получить. Ваш подход связан с изменением сущности или части модели приложения, чего я хочу избежать. Мне нужно передать _data, который доступен мне в контроллере_ к методу _set объекта моей Лиги, который вызывается _Symfony \ ... \ Form_. По-видимому, нет аккуратного способа сделать это. Я попытаюсь сделать инъекцию dependecy в конструкторе Лиги. Спасибо за ввод! –

+0

@JamilNajafov Не могли бы вы просто передать свои данные в массив $ options вашего buildForm? – Veve

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