Какова наиболее успешная практика для строительства списка выбора

У меня есть форма с элементом типа выбора. Я должен населить его с данными. Поскольку я знаю, что есть 3 метода.

1. Диспетчер:

// Controller
public function myAction()
{
      $choices = ...;//create choices array
      $form = $this->createForm(new MyFormType($dm), null, array(
            'choices' => $choices,
        ));
}

// Form
class MyFormType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('cars', 'choice', array(
                'choices' => $options['choices']
        ));
    }
}

2. Класс формы + хранилище

// Controller
public function myAction()
{
      $dm = $this->get('doctrine')->getManager();
      $form = $this->createForm(new MyFormType($dm));
}

// Form
class MyFormType extends AbstractType
{
    private $dm;

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

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('cars', 'choice', array(
                'choices' => $options['choices']
        ));
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $list = array();
        foreach($this->dm->getRepository('MyBundle:Cars')->findAll() as $car) {
            $list[$car->getName()] = $car->getName();
        }

        $resolver->setDefaults(array(
            'choices'        => $list,
        ));
    }
}

3. Класс формы + служба поддержки

// Controller
public function myAction()
{
      $dm = $this->get('doctrine')->getManager();
      $form = $this->createForm(new MyFormType(), null, array(
            'myservice' => $this->get('myservice'),
        ));
}

// Form
class MyFormType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('cars', 'choice', array(
                'choices' => $options['myservice']->getCars()
        ));
    }
}

// Service
class MyService
{
    const ENTITY_CAR = 'MyBundle:Cars';

    /** @var DocumentManager */
    private $dm;

    public function __construct(DocumentManager $dm)
    {
        $this->dm = $dm;
    }

    public function getCars()
    {
        return $this->dm->getRepository("MyBundle:Cars")->findAll();
    }
}

Я выражу свои мысли.

1-й вариант не наиболее успешная практика. Особенно, когда сложная логика включается. Диспетчеры должны быть максимально крошечными.

2-е намного лучше. Но это выставляет название предприятия, и проблемы могут произойти, если я решаю переименовать его.

3-м является наилучший вариант, по моему скромному мнению. Названия предприятия сконцентрированы в одном месте, лучшем намеке типа IDE, централизовал управление предприятия (поиск, спасите, удалите...). Главный недостаток - возможный сверхспроектированный класс, поскольку это становится ответственным за многие операции по чтению-записи. С другой стороны, это может быть разделено на части.

Что вы думаете об этом?

2
nl ja de

2 ответы

The third option is good if you have to reuse that service elsewhere in your code (and if that service will grown in comparison of that you've wrote, we'll see it later). In that way, as you said, "manager" of that entity is one and contains itself the name of repo,a const, and so on.

, НО

If this service is use only as a "pusher" for reach your repository by hiding its name, I don't think that this solution is still much good as it seems.
Obviously if that service is thought for have multiple persistance options and multiple retrieve option (base on what ORM you've selected), in that case this could be the best practice.

В других случаях я предполагаю, что второй всегда - лучше.

Первое не реально, если вы не хотите проигнорировать все хорошие методы

2
добавлено

Я предлагаю четвертое решение: используйте предприятие область, поскольку это разработано, чтобы быть областью выбора с вариантами, загруженными от DB!

Here is the official doc http://symfony.com/doc/master/reference/forms/types/entity.html

И как можно использовать его:

// Form
class MyFormType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('cars', 'entity', array(
            'class' => 'MyBundle:Cars',
            'property' => 'name',
            //Optionnal if you need to condition the selection
            'query_builder' => function(EntityRepository $er) {
                return $er->createQueryBuilder('u')->orderBy('u.username', 'ASC');
            },
        ));
    }
}
1
добавлено
В чем вы нуждаетесь как стоимость и текст для ваших вариантов?
добавлено автор AlterPHP, источник
В случае этого решения I can' t установленные значения для списка вариантов. Собственность имя определяет этикетки только, и индексы используются в качестве ценностей это it' s не подходящий для меня.
добавлено автор marden, источник
phpGeeks
phpGeeks
3 620 участник(ов)

Best PHP chat Еще: @dbGeeks - базы данных @phpGeeksJunior - новичкам @moscowProgers - IT Москва @ebanoePhp - весёлый канал о PHP @laravel_pro - Laravel @jobGeeks - вакансии @jsChat - JS Правила: https://t.me/phpGeeks/764859 ДР - 28.03.2016

PHP
PHP
1 309 участник(ов)

Группа про современный PHP. Обсуждаем ООП, TDD, BDD, DDD, SOLID, GRASP и прочие крутые базворды Для ознакомления: https://gist.github.com/mkusher/711bd46f0b62fbae851182e6fb3b1839 Группа PHP для новичков @phpGeeksJunior Вакансии: https://t.me/fordev

PHP — вакансии, поиск работы и аналитика
PHP — вакансии, поиск работы и аналитика
1 251 участник(ов)

Публикуем вакансии и запросы на поиск работы по направлению PHP, Laravel, Symfony, Yii и т.д. Здесь всё: full-time, part-time, remote и разовые подработки. См. также: @qa_jobs, @devops_jobs, @javascript_jobs, @nodejs_jobs, @uiux_jobs, @products_jobs

symfony
symfony
1 045 участник(ов)

Сообщество Symfony, Symfony Components, Symfony Framework. Вакансии: https://t.me/symfony_careers Официальный slack: https://symfony.com/slack-invite

phpGeeksJunior
phpGeeksJunior
980 участник(ов)

Группа для новичков. Не стесняйтесь задавать вопросы по php. Не флудить!!!! Правила и полезные ссылки https://gist.github.com/exileed/a53dd0617b35a705ff44b38c8028e6a5 Бест от пхпгикс https://t.me/best_of_phpgeeks

phpclub.ru
phpclub.ru
872 участник(ов)

Официальный чат phpclub.ru - остерегайтесь подделок #rules Правила группы - уважайте друг друга. Скриншоты -> ссылками. Код -> pastebin.com. Вакансии строго -> https://goo.gl/4bNxym, в чат ссылку. За рекламу и мат - БАН!

symfony
symfony
354 участник(ов)

Devall | PHP
Devall | PHP
272 участник(ов)

Пристанище для восходящих звёзд разработки, которые перейдут на более адекватные языки. http://combot.org/chat/-1001014863761 Инвайт: j.mp/devallphp