Модуль user, прошу оценить
Модуль user, прошу оценить
Доброго времени суток!
Прошу оценить правильность подходов проектирования данного модуля. Точнее рефакторинга, т. к. после очередной итерации внесения пачки изменений в старый проект стало ясно, что без продуманной архитектуры на длительно существующих проектах жить нельзя, и что толстые модели это хорошо пока они не начинают занимать по 1К строк, и складывание всего и все в before... after... очень плохая идея. Хочется выработать компромисс между строгими принципами слоистой архитектуры, и AR = БД + форма + логика.
yii2-user
Прошу оценить правильность подходов проектирования данного модуля. Точнее рефакторинга, т. к. после очередной итерации внесения пачки изменений в старый проект стало ясно, что без продуманной архитектуры на длительно существующих проектах жить нельзя, и что толстые модели это хорошо пока они не начинают занимать по 1К строк, и складывание всего и все в before... after... очень плохая идея. Хочется выработать компромисс между строгими принципами слоистой архитектуры, и AR = БД + форма + логика.
yii2-user
- samdark
- Администратор
- Сообщения: 9489
- Зарегистрирован: 2009.04.02, 13:46
- Откуда: Воронеж
- Контактная информация:
Re: Модуль user, прошу оценить
Не правильные они. Зашито всё намертво начиная от хранилища и схемы для юзера и заканчивая невозможностью прицепить свою identity.
Нравится Yii? Давайте сделаем его лучше!.
Re: Модуль user, прошу оценить
А если так? cfcbdf7 Можно ещё User в конструкторе сервиса заменить интерфейсом, как и PasswordHelper в методах.
Не совсем, часть вынести в сторонние классы, когда кода станет слишком много и будет что вынести (в новом коммите вынес работу с паролем в PasswordHelper).
Re: Модуль user, прошу оценить
Если было весьма странно:
Код: Выделить всё
class UserService
{
protected $userModel;
public static function getUserById($id)
{
$model = User::findOne($id);
if ($model === null) {
throw new UserNotFoundException();
}
$instance = new self();
$instance->userModel = $model;
return $instance;
}
public function delete() {
$this->userModel->delete();
}
}
Код: Выделить всё
class UserService
{
protected $userModel;
public function __construct(User $user) {
$this->userModel = $user;
}
public function getUserById($id) {
$userModel = $this->userModel;
$model = $userModel::findOne($id);
if ($model === null) {
throw new UserNotFoundException();
}
$this->userModel = $model;
return $this;
}
public function delete() {
$this->userModel->delete();
}
}
Код: Выделить всё
class UserService
{
private $userClass;
public function __construct($userClass) {
$this->userClass = $userClass;
}
public function getUserById($id) {
return $this->getUser(['id' => $id]);
}
public function getUserByName($name) {
return $this->getUser(['username' => $name]);
}
public function delete($id) {
$this->getUser(['id' => $id])->delete();
}
private function getUser(array $criteria) {
$class = $this->userClass;
if (!$model = $class::findOne($criteria)) {
throw new UserNotFoundException();
}
return $model;
}
}
- samdark
- Администратор
- Сообщения: 9489
- Зарегистрирован: 2009.04.02, 13:46
- Откуда: Воронеж
- Контактная информация:
Re: Модуль user, прошу оценить
А что принципиально поменялось?А если так?
Нравится Yii? Давайте сделаем его лучше!.
- samdark
- Администратор
- Сообщения: 9489
- Зарегистрирован: 2009.04.02, 13:46
- Откуда: Воронеж
- Контактная информация:
Re: Модуль user, прошу оценить
Если вы хотите сделать действительно универсальный модуль, то он не должен знать о модели User, её полях или её хранении вообще ничего. Он должен требовать, объявляя интерефейсы, а не работать с чем есть.
Нравится Yii? Давайте сделаем его лучше!.
Re: Модуль user, прошу оценить
Всем спасибо, буду думать...
Хотелось в первую очередь разнести задачи выполняемые в модуле по разным классам максимально разгрузив AR (не отказываюсь от неё) и модели для форм, и изолировать Identity от User.
Ещё вопрос, есть достаточно большая AR модель с большим числом полей, пользовательскую валидацию хочется сделать отдельно, в отельной модели. Есть ли какой-то механизм упрощающий задачу, долго будет перечислять все поля класса новой модели вручную, DinamicModel вроде подходит, можно ей передать в конструктор attributes AR модели, но может есть что-то ещё?
Хотелось в первую очередь разнести задачи выполняемые в модуле по разным классам максимально разгрузив AR (не отказываюсь от неё) и модели для форм, и изолировать Identity от User.
Ещё вопрос, есть достаточно большая AR модель с большим числом полей, пользовательскую валидацию хочется сделать отдельно, в отельной модели. Есть ли какой-то механизм упрощающий задачу, долго будет перечислять все поля класса новой модели вручную, DinamicModel вроде подходит, можно ей передать в конструктор attributes AR модели, но может есть что-то ещё?
Re: Модуль user, прошу оценить
если задача просто уменьшить кол-во кода в одной модели для лучшей читаемости кода, то можно валидацию вынести в трейт, напримерdimagml писал(а): ↑2017.01.18, 23:54 Ещё вопрос, есть достаточно большая AR модель с большим числом полей, пользовательскую валидацию хочется сделать отдельно, в отельной модели. Есть ли какой-то механизм упрощающий задачу, долго будет перечислять все поля класса новой модели вручную, DinamicModel вроде подходит, можно ей передать в конструктор attributes AR модели, но может есть что-то ещё?
Re: Модуль user, прошу оценить
Да, так как у вас этот маппинг будет в слое контроллеров-форм, а не в домене, там можно не бояться добавлять зависимости и использовать всякие dynamic models. hydrators, mappers.dimagml писал(а): ↑2017.01.18, 23:54 Всем спасибо, буду думать...
Хотелось в первую очередь разнести задачи выполняемые в модуле по разным классам максимально разгрузив AR (не отказываюсь от неё) и модели для форм, и изолировать Identity от User.
Ещё вопрос, есть достаточно большая AR модель с большим числом полей, пользовательскую валидацию хочется сделать отдельно, в отельной модели. Есть ли какой-то механизм упрощающий задачу, долго будет перечислять все поля класса новой модели вручную, DinamicModel вроде подходит, можно ей передать в конструктор attributes AR модели, но может есть что-то ещё?
Re: Модуль user, прошу оценить
Если не откажешься от использования AR в качестве Entity - не получишь независимости от структуры БД и типа БД, а еще практически лишишься возможности тестировать свой код без БД. Тут надо приоритеты для себя расставить. От чего хочешь изолироваться в своем коде, если желание есть написать универсальный модуль, тогда абстрагируемся почти от всего.
Re: Модуль user, прошу оценить
Мне кажется, ТС не особо понимает, что вообще есть независимый модуль и плюсы и причины слоистой архитектуры. Он представил обычный yii-модуль с обычными yii-классами, распиханными по папочкам, назвал это архитектурой. А комментирующие не поняли это и советуют ему все исправить как "взрослому".
- samdark
- Администратор
- Сообщения: 9489
- Зарегистрирован: 2009.04.02, 13:46
- Откуда: Воронеж
- Контактная информация:
Re: Модуль user, прошу оценить
Да. Эта тема уже неоднократно поднималась: http://rmcreative.ru/blog/post/moduli-yii
Нравится Yii? Давайте сделаем его лучше!.
Re: Модуль user, прошу оценить
Гложет подозрение что ТС не спрашивал ни о каком "универсальном" или "независимом" модуле, а о вполне конкретном, под определенное приложение (namespace app\modules\user;) и о том как его улучшить по гибкости к будущим изменениям.
Yii2 universal module sceleton - for basic and advanced templates