\Yii в сервисах

Обсуждаем, как правильно строить приложения
Ответить
Auramel
Сообщения: 80
Зарегистрирован: 2017.11.17, 14:39
Откуда: Russia, Ufa
Контактная информация:

\Yii в сервисах

Сообщение Auramel »

Всем привет. Есть такой трабл: работал раньше на Slim 3. Там Container (вроде, Di) передавался в конструктор контроллера. А из контроллера я уже передавал нужную вещь в нужный метод.

На yii2 делаю подобную вещь и недавно спросили - почему просто в классе не пишу напрямую, а кидаю через аргумент. И вот ответить по-умному не могу, а что-то внутри говорит, что так неправильно будет (если напрямую).

Вот пример:

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

class PageController
{
	public function actionSignIn(): Response
	{
		$service = new SignInService();
		
		if ($service->canSignInUser(Yii::$app->getRequest()->post(), Yii::$app->getSecurity())) {
			$service->signInUser(Yii::$app->getUser());
			return $this->redirect(['user/profile']);
		}
		
		return $this->goBack();
	}
}

class SignInService
{
	public function canSignInUser(array $userData, Security $security): bool
	{
		// если такой юзер есть идем дальше, иначе - return false
		
		// если пароль гавно - return false
		if (!$security->validatePassword($userData['pass'], $user->getAttribute('pass')) {
			return false;
		}
		
		$this->_user = $user;
		
		return true;
	}
	
	public function signInUser(User $user): void
	{
		$user->login($this->_user);
	}
	
	private $_user = null;
}
Жду жесткой критики умных людей (за и против такого дела), чтобы аж программировать расхотелось :D ;)

P.S. мне предлагают не кидать в аргументы вещи типа Yii::$app->getUser(), а прямо в методах писать сразу \Yii::$app->getUser()->login($user);
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: \Yii в сервисах

Сообщение samdark »

В Yii также передаётся в конструктор контроллера. Почему так делать лучше — вы явно не завязываетесь в контроллере на класс "Yii". Практически именно для контроллера в этом смысла особо нет, контроллеры не должны содержать сложной логики и тестировать их незачем. А вот для суб-зависимостей смысл определённо есть. Можно все их зависимости выразить интерфейсами.

Что гуглить: "low coupling"
Auramel
Сообщения: 80
Зарегистрирован: 2017.11.17, 14:39
Откуда: Russia, Ufa
Контактная информация:

Re: \Yii в сервисах

Сообщение Auramel »

samdark писал(а): 2018.03.20, 00:03 В Yii также передаётся в конструктор контроллера. Почему так делать лучше — вы явно не завязываетесь в контроллере на класс "Yii". Практически именно для контроллера в этом смысла особо нет, контроллеры не должны содержать сложной логики и тестировать их незачем. А вот для суб-зависимостей смысл определённо есть. Можно все их зависимости выразить интерфейсами.

Что гуглить: "low coupling"
Вот это неожиданно щас было xD. Не знал, что в yii также. Круто. Очень круто. Спасибо за информацию. 😃
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: \Yii в сервисах

Сообщение samdark »

Ну почему вдруг неожиданно? В доках чуть ли не с бета-версии: http://www.yiiframework.com/doc-2.0/gui ... ainer.html
Auramel
Сообщения: 80
Зарегистрирован: 2017.11.17, 14:39
Откуда: Russia, Ufa
Контактная информация:

Re: \Yii в сервисах

Сообщение Auramel »

samdark писал(а): 2018.03.20, 18:55 Ну почему вдруг неожиданно? В доках чуть ли не с бета-версии: http://www.yiiframework.com/doc-2.0/gui ... ainer.html
Знакомство с yii2 началось с подготовкой к worldskills (олимпиады типа). Там надо было как можно быстрее колхозить и чтобы работало. Не до доков было - видосы с ютуба и статьи говнокодеров с инета. Так что все свое - родное. :)

UPD: вспомнил, что мутил эту "дичь". Вспомнил и почему отказался от этой идеи - аргументы. Я всегда боялся переопределять методы. Тут же уже есть аргументы. А, если делать по Вашему совету - придется их порядок менять (или нет), количество точно поменяется. Конечно, если знать, что да как там работает - понимаешь, что не сломается.
Ответить