Задать вопрос

Нужно ли использовать Symfony forms?

Изучаю Symfony Forms. В теории все звучит красиво и просто. Однако в реальности проблемы возникают с формой уже с тремя полями, если одно поле зависит от другого. Например, есть сущности Город - Район - Метро:

class City
{
    /**
     * @ORM\OneToMany(targetEntity="App\Entity\District", mappedBy="city")
     */
    private $districts;
}


class District
{
    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\City", inversedBy="districts")
     * @ORM\JoinColumn(nullable=false)
     */
    private $city;

    /**
     * @ORM\OneToMany(targetEntity="App\Entity\MetroStation", mappedBy="district")
     */
    private $metroStations;
}


class MetroStation
{
    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\District", inversedBy="metroStations")
     * @ORM\JoinColumn(nullable=false)
     */
    private $district;
}


Очевидно, что, несмотря на то, что Метро имеет привязку только к району, в форме добавления/изменения метро я хочу иметь возможность выбрать сначала Город, потом один из Районов этого города.

Абсолютно стандартная задача, однако найденные мною туториалы по теме "dependent fields" предлагают использовать Form events для того, чтобы при редактировании формы получить необходимые данные. Зачем? Если необходимые данные можно получить прямо в методе buildForm()?

Кроме того, Symfony Forms в данной ситуации никак не избавляют от необходимости вручную реализовывать ajax-запросы для получение списка Районов при выборе Города.

На мой взгляд подход, который применяется в Laravel, когда каждой операции с сущностью (список, форма просмотра, форма редактирования, новая запись, обработчики добавления, изменения и удалению) соответствует свой метод в контроллере, гораздо более прозрачен и понятен.

Объясните, пожалуйста, в чем "фишка" Symfony Forms и их преимущество? По-моему всё выглядит так, что они хороши для очень простых форм.
  • Вопрос задан
  • 369 просмотров
Подписаться 4 Средний 3 комментария
Пригласить эксперта
Ответы на вопрос 2
Обычно работает так:

1) Фронт - это отдельное какое-то js-фреймворк, который отдает Rest запрос

2) Контроллер на уровне DTO с помощью ParamConverter и Валидаций принимает значения, либо дает отбивку фронту.

3) Значение уходит в сервис, где идет какая-то логика и возвращается ответ через какой-то json=нормалайзер.

___

P.s. привыкай к тому, что в больших проектах на Symfony вообще не юзается вот это все:

* @ORM\ManyToOne(targetEntity="App\Entity\City", inversedBy="districts")
* @ORM\JoinColumn(nullable=false)

Доктриновские связи работают не всегда адекватно и быстро, поэтому обычно делают составной ключ на 2-3 колонки и зависимости вытягиваются из репозиторией отдельным запросом.
Ответ написан
@ozornick
Тема не настолько стара, что хотел бы тоже спросить. Похожая ситуация возникает. До создания объекта (то есть не редактирование сохраненной сущности) не найду как обработать форму. Есть объект User, у него зависимости вложенные.
$user = $this->getUser();
// Какое то значение
$client = $user->getClient()->getClientSomeData();
// Допустим теги, описания, которое являются ArrayCollection вообще тьма
$clientTags = $user->getClient()->getTags()->getTag()->getName();

С учетом отношений ManyToMany, OneToOne форму не знаю как реализовать. При сохранении ведь не генерируется связь.
Да же как у автора, нужно получить сначала User, у него взять client_id ключ связи, потом сам $user->getClient() и так далее
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы