Извлечение записей сущностей для формы UserAdmin

Я довольно новичок в Symfony и пытаюсь разобраться с платформой. Мне удалось установить Sonata CMF, FOS User Bundleи Sonata User Bundle, Я дошел до того, что я могу создавать пользователей и другие сущности с помощью готовой CMS.

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

Мне удалось получить вариант «выбор» в форме. Часть, с которой я борюсь, — это сбор стран (хранящихся в моей базе данных) в массив, чтобы затем перейти к этому выбору. Итак, в настоящее время у меня есть это:

<?php

namespace Application\Sonata\UserBundle\Admin\Model;

use Sonata\AdminBundle\Form\FormMapper;
use Sonata\AdminBundle\Datagrid\ListMapper;
use Sonata\AdminBundle\Datagrid\DatagridMapper;
use Sonata\UserBundle\Admin\Model\UserAdmin as BaseType;

use MyApp\CmsBundle\Entity\Country;

class UserAdmin extends BaseType
{
/**
* {@inheritdoc}
*/
protected function configureFormFields(FormMapper $formMapper)
{
// TODO: get countries from DB instead of hardcoding here
$countries = array(
1 => 'Country 1',
2 => 'Country 2',
3 => 'Country 3',
4 => 'Country 4',
5 => 'Country 5',
);

$formMapper
->with('Profile')
->add('username', 'text')
->add('email')
->add('firstname', null, array('label' => 'form.firstname', 'required' => true, 'translation_domain' => 'SonataUserBundle'))
->add('lastname', null, array('label' => 'form.lastname', 'required' => true, 'translation_domain' => 'SonataUserBundle'))
->end()
->with('Address')
->add('line1', 'text', array('label' => 'form.line1', 'required' => false, 'translation_domain' => 'SonataUserBundle'))
->add('line2', 'text', array('label' => 'form.line2', 'required' => false, 'translation_domain' => 'SonataUserBundle'))
->add('city', 'text', array('label' => 'form.city', 'required' => true, 'translation_domain' => 'SonataUserBundle'))
->add('postcode', 'text', array('label' => 'form.postcode', 'required' => false, 'translation_domain' => 'SonataUserBundle'))
->add('country', 'choice', array('label' => 'form.country', 'required' => true, 'translation_domain' => 'SonataUserBundle', 'choices' => $countries))
->end()
;

// etc...
}

Я уже некоторое время гуглю, и единственное, что я продолжаю видеть, это использовать $em = $this->getDoctrine()->getManager(); но это только кажется, что работает в Controller классовый контекст.

Подводя итог, я хочу получить $countries массив из базы данных вместо его жесткого кодирования.

ОБНОВИТЬ

Я только что понял, что в случае стран Symfony имеет вариант выбора, который можно использовать «из коробки»: http://symfony.com/doc/current/book/forms.html#choice-fields

->add('country', 'country', array('label' => 'form.country', 'required' => true, 'translation_domain' => 'SonataUserBundle'))

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

0

Решение

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

Вы можете объявить любой из ваших классов как сервис, чем в вашем определении сервиса в services.xml (в соответствии с лучшими практиками xml formatt предпочитают) вам нужно пройти <argument type="service" id="doctrine">, чем в классе обслуживания назначить его какому-нибудь proerty в конструкторе и объявить getter для этого свойства, которое использует его как $this->getDoctrine()->getRepostitory() ..., Поэтому я надеюсь объяснить базовый рабочий процесс. Для получения дополнительной информации смотрите документация.

0

Другие решения

это плохая практика использовать объект внутри другого. Тем не менее, вы можете ввести в конструктор менеджер предприятия как это:

<?php

namespace Application\Sonata\UserBundle\Admin\Model;

use Sonata\AdminBundle\Form\FormMapper;
use Sonata\AdminBundle\Datagrid\ListMapper;
use Sonata\AdminBundle\Datagrid\DatagridMapper;
use Sonata\UserBundle\Admin\Model\UserAdmin as BaseType;

use MyApp\CmsBundle\Entity\Country;

class UserAdmin extends BaseType
{
private $em;

public function __contruct($em)
{
parent::__construct();
$this->em = $em;
}
}

Тогда в вашем entityВы можете позвонить repository вот так, пример для извлечения всех стран:

$countries = $this->em->getRepository('YourBundle:YourEntity')->findAll();
0

По вопросам рекламы [email protected]