DI. Передача аргументов в формы с помощью DI

Обсуждаем, как правильно строить приложения
Ответить
Vitalik_yii
Сообщения: 65
Зарегистрирован: 2014.01.13, 10:03

DI. Передача аргументов в формы с помощью DI

Сообщение Vitalik_yii »

Добрый день!

Например, у нас есть форма EmployeeCreateForm, которой для валидации необходим репозиторий (Проверить, например, наличие юзера в базе). Каким образом передать этот самый репозиторий, который со своими параметрами установлен в DI контейнере? Через контроллер?
Есть ли еще какие-то варианты для этого c помощью DI, т.к. в данном случае контроллер будет являться простым посредником в передаче, т.е. по сути он его не использует, а просто передает через себя в эту самую форму EmployeeCreateForm.

Код: Выделить всё


namespace app\controllers;
 
use app\forms\EmployeeCreateForm;
use app\services\EmployeeService;
use app\repositories\EmployeeRepository;

class EmployeeController
{
    private $employeeService;
 
    public function __construct(EmployeeService $employeeService, EmployeeRepository $employeeRepository)
    {
        $this->employeeService = $employeeService;
        $this->employeeRepository = $employeeRepository;
    }
 
    public function actionCreate()
    {
        $form = new EmployeeCreateForm($this->employeeRepository);// ?????
 
        if ($form->load(\Yii::$app->request->post()) && $form->validate()) {
            try {
                $this->employeeService->create($form->getDto());
                .....
            } catch (\DomainException $e) {
		....
            }
        }
 
        return $this->render('create', [
            'form' => $form,
        ]);
    }
}

Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: DI. Передача аргументов в формы с помощью DI

Сообщение ElisDN »

Код: Выделить всё

$form = Yii::createObject(EmployeeCreateForm::class);
Vitalik_yii
Сообщения: 65
Зарегистрирован: 2014.01.13, 10:03

Re: DI. Передача аргументов в формы с помощью DI

Сообщение Vitalik_yii »

Дмитрий, спасибо за ответ. Хотелось бы узнать мнение по поводу того, правильно использовать Yii:: в контроллере в данном случае? И не только с точки зрения YII, интересно как это реализуется в других фреймворках? И какой подход тут будет в таком случае более правильный?
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: DI. Передача аргументов в формы с помощью DI

Сообщение ElisDN »

Либо напрямую, если в контроллере доступен контейнер:

Код: Выделить всё

$form = Yii::createObject(EmployeeEditForm::class, [$employee]);
Либо заморочиться и наделать фабрик:

Код: Выделить всё

$form = $this->employeeEditFormFactory->createForm($employee);
Ответить