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