Как правильно внедрить контейнер в файл формы, не нарушая действия, связанные с CRUD? - PullRequest
0 голосов
/ 17 февраля 2012

В настоящее время я ввел контейнер в свою форму (сделав его службой):

ApFloorType.php

namespace Techforge\ApartmentBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilder;
use Symfony\Component\DependencyInjection\ContainerInterface;


class ApFloorType extends AbstractType
{

    //in the controller, they are differently initialised
    private $container;

    public function __construct(ContainerInterface $container)
    {
        $this->container = $container;
    }


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

        $bath_choices = $this->container->getParameter('bath_choices');
        $bed_choices = $this->container->getParameter('bed_choices');

        $builder
            ->add('baths', 'choice', array('choices' => $bath_choices))
            ->add('beds', 'choice', array('choices' => $bed_choices))
            ->add('name')
            ->add('file')
            ->add('plan_description', 'textarea')
            ->add('min_max_feet', 'text')
            ->add('deposit', 'text')
            ->add('application_fee')
            ->add('rental_deposit')
            ->add('lease_terms', 'textarea')
            ->add('threshhold_value')
            ->add('auto_accept')
            ->add('pending')
            ->add('apartment', 'hidden', array('property_path' => false))
            ->add('pre_post_update', 'hidden')
            ->add('photos', 'collection', array('type' => new ApFloorImageType()))

        ;
    }

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

Проблема заключается в том, что CRUD-система ApFloor перестала работать после этого, потому чтов моем контроллере я не могу просто написать

$form   = $this->createForm(new ApFloorType(), $floor);

Это приведет к следующей ошибке:

Catchable Fatal Error: Аргумент 1 передан Techforge \ ApartmentBundle \ Form \ApFloorType :: __ construct () должен реализовывать интерфейс Symfony \ Component \ DependencyInjection \ ContainerInterface, ни один из которых не задан, вызывается в /home/stormlifter/webapps/pmr/src/Techforge/ApartmentBundle/Controller/Manager/ApFloorController.ph и определен в on-line строке 38/home/stormlifter/webapps/pmr/src/Techforge/ApartmentBundle/Form/ApFloorType.php строка 16

Я решил эту проблему, вызвав такой метод создания формы;

$form   = $this->createForm($this->get('apfloortype'), $floor);

Итак, мой вопрос: есть ли обходной путь, чтобы мне не приходилось менять каждый вызов createForm () в моем контроллере CRUD после того, как он стал сервисом?

1 Ответ

0 голосов
/ 23 ноября 2013

Это то, что я сделал в FormType:

$data = Class::getYourData();

Потому что я не хочу (как и вы) изменять каждый контроллер для установки дополнительного параметра в форме.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...