

Ad.x ??
12.03.2018
18:24:20
Итак, флуд пошел, значит можно напрягать снова)))
Делаю модули, в модулях есть внешние зависимости, что логично. Например - модель юзера, которая находится в другом модуле.
Название ее класса передаю как параметр в модуль (через его конфиг), соответственно, в базовом классе модуля производится проверка интерфейса, и есть поле.
В контроллере обращатся к модулю - не зазорно. Но есть модель. В модели есть связь именно на эту внешнюю модель юзера, класс которой передается через конфиг модуля. Можно, конечно, прямо в модели вызывать свойство модуля, я так раньше делал, но это ж вроде как плохо, да?
Теперь передаю этот класс параметром при создании модели. Но! Так не получится, если модель берется через выборку, а не оператором new.
Соответственно, пришлось в ActiveQuery модели переопределить методы all() и one(), и в контроллере передавать туда параметр.
Насколько такой подход будет верным? Я просто пока что лутше не придумал.
Модуль:
https://pastebin.com/D7t53xNk
Модель:
https://pastebin.com/GKG137Dm
Вызов в контроллере:
ActiveQuery:
https://pastebin.com/EgawVSu8
В контроллере вызов:
$firms = Firm::find()->all(['userModel' => $this->module->userModel]);
это все кастыли как по мне


Matviy
12.03.2018
18:25:08
Так а как тогда такю зависимость передать?
такую

Ad.x ??
12.03.2018
18:27:20
к сожалению я не знаю. Тож долго думал на эту тему. и ниче толкового не придумал

Google

Ad.x ??
12.03.2018
18:27:45
решил забить болт и делать как все :)
либо, принять тот факт что за пределы фрейма ты свой модуль не выкинешь ) и тогда класть идентити модельку в контейнер под интерфейсом фреймовского идентити
уже оттуда дергать ее

Matviy
12.03.2018
18:30:03
А как все делают?)
Не, ну от фрейма отвязатся я и не планирую

Ad.x ??
12.03.2018
18:30:39
Можно, конечно, прямо в модели вызывать свойство модуля, я так раньше делал, но это ж вроде как плохо, да? вот так )

Matviy
12.03.2018
18:30:45
И тут ж н только про идентити, а вообще про зависимости
Но перекинуть в другой проект на том же фреймворке - чем плохо?
Кроме того, если минимизировать зависимости, проще вносить изменения потом, проверено уже

Ad.x ??
12.03.2018
18:31:33
тем что раскидаешь эти кастыли по всем проектам
потом покажется тебе что это херовая идея была, но будет уже поздно :)

Matviy
12.03.2018
18:32:32
Ну я тут вижу костыль только в части передачи параметра в результат выборки, а так прокидывать через сфойство модуля - неплохо, как мне кажется
Вот в выборку - лутше не придумал

Google

Ad.x ??
12.03.2018
18:33:25
тут в целом все сложно. даже если ты прокинешь эти зависимости. например в фильтре где-нибудь тебе понадобится список юзеров
ии... откуда их дергать? я вот хз

Matviy
12.03.2018
18:34:49
ТОгда делать в интерфейсе метод, который отдает всех юзеров, по другому никак. А в самой модели юзера реализовать интерфейс
В любом случае, так будешь точно значить, що звязи между модулями описаны в интерфейсах четко
И не париться, если меняэться что-нибуть другое

Ad.x ??
12.03.2018
18:39:09
http://www.yiiframework.com/doc-2.0/yii-web-identityinterface.html суда клади свою юзер модельку и потом забираешь с контейнера и делаешь чо нада
вот как делать связи... ваще вопрос )

Matviy
12.03.2018
18:41:17
Ну вот, так и много их

Ad.x ??
12.03.2018
18:44:01
был бы инжект через метод.. можно было бы что-то типа:
public function getAdministrators(\yii\web\IdentityInterface $user)
{
return $this->hasMany($user::class, ['id' => 'user_id'])
->viaTable('{{%std_firms_administrators}}', ['firm_id' => 'id']);
}
м.б. через рефлексию или как
или попробовать через конструктор закинуть... бля )
но как это скажется на производительности...

Matviy
12.03.2018
19:06:22
Ну в моїм случае, производительность самого пхп - последнее, г чем нужно парится)

Ad.x ??
12.03.2018
19:08:43
в твоем случае нет интерфейсов

Matviy
12.03.2018
19:09:13
Есть
Если захочу

Ad.x ??
12.03.2018
19:09:31
без них смысла нет эти зависимости прокидывать

Matviy
12.03.2018
19:09:35
Пока что не нужно для юзера, но если будет еще что-то, то буду писать свои
По-сути, сейчас интерфейсы вот:
DependenciesCheckHelper::checkClassHasParent($this->userModel, '\yii\db\ActiveRecord');
DependenciesCheckHelper::checkClassImplementsInterface($this->userModel, '\yii\web\IdentityInterface');
То есть, класс юзера должен быть потомком ЕктивРекорд и реализовывать АйдентитиИнтерфейс
Если есть что-то еще, тогда нужно уже свой писать для каждой зависимости, да это не сложно, вобщем

Google

Ad.x ??
12.03.2018
19:22:59
все не то
хэлперы эти
лишние )

Matviy
12.03.2018
19:28:02
Ну а как проверять интерфейс?
Это мой хелпер, просто чтоб не пихать всюду один и тот же код

Ad.x ??
12.03.2018
19:30:36
не знаю )

SiZE
12.03.2018
19:31:07

Ad.x ??
12.03.2018
19:32:17
оно все как-то очень и очень печально выглядит

(;¬_¬)
12.03.2018
19:32:39
посоны, там codeception поломали с 2.4.0

Matviy
12.03.2018
19:32:48
Ну так и проверяю. просто в хелпере реализована возможность проверять сразу несколько, и. т. д.

Ad.x ??
12.03.2018
19:33:39
я вообще не вижу нормальных вариантов )

Matviy
12.03.2018
19:33:54
Ну вот. поэтому так делаю) Я ж по всякому пробовал
Тут же даже не по фреймворку вопрос, а в целом. Как-то же прокидываются зависимости
Со всех способов вариант с интерфейсами кажется самым нормальным
Классы передавать в свойства модуля, в модуле проверять на интерфейсы и другие ограничения, а там уже использовать, как хочется

Konstantin
12.03.2018
19:35:29
какая примерно зарплата в питере у прогера делающего лендинги, html верстку стили свой дизайн согласно заданию?

Ad.x ??
12.03.2018
19:36:07
по нормальному нада внедрять зависимости через контейнер, а не через свойства модуля )
и тут вот очко полное

Matviy
12.03.2018
19:36:39

Google

Matviy
12.03.2018
19:36:53
И через контейнер все равно в свойства записывают, разве нет?

Ad.x ??
12.03.2018
19:37:55
ну если там лежит что-то под интерфейсом, ты можешь быть уверен что оно реализовано

Matviy
12.03.2018
19:38:20
Или имеется ввиду прямо в главном классе модуля делать внедрение в класс модели?
Кстати, вариант. Я че-то не подумал

Ad.x ??
12.03.2018
19:38:43
а в твоем случае где гарантия, что есть метод какойнить типа: getOnlyEnabledUsers()

Matviy
12.03.2018
19:38:59

Ad.x ??
12.03.2018
19:39:28
только то что имплементит его

Matviy
12.03.2018
19:39:47
Честно-говоря, плаваю в нем еще)

Admin
ERROR: S client not available

Matviy
12.03.2018
19:40:28
как мне, допустим, заинжектить название класса юзера в класс модели фирмы в модуле, чтоб срау проверять интерфейс?
Я не совсем понимаю механизм

Ad.x ??
12.03.2018
19:40:57
в том то и проблема что никак )
то, что будет под интерфейсом, вернется объектом уже

Matviy
12.03.2018
19:43:07
Ну можна просто сначала проверить имплементацию интерфейса, и тогда инжектить

Ad.x ??
12.03.2018
19:43:35
допустим положим класс в контейнер:
Yii::$container->set('psr\log\LoggerInterface', \monolog\Logger::class):
а заберем уже объект:
Yii::$container->get('psr\log\LoggerInterface');
и в конструктор заинжектится объект
че там придумать универсальное я даж не знаю... ебашить как все да и все )

Matviy
12.03.2018
19:45:43
Так я ж не объект, а название класса передать должен

Google

Ad.x ??
12.03.2018
19:46:01
ну так и я о чем
передашь название класса, потом будешь проверять 100500 методов есть там или нет

Matviy
12.03.2018
19:47:17
Так эти 100500 методов в интерфейс, и проверять, имплементит ли

Ad.x ??
12.03.2018
19:47:18
в ларавели выкрутились, фасады придумали :D
автоматом попадешь ровно в туже зависимость что и был ранее

Matviy
12.03.2018
19:48:35
Но таки лутше зависимости в классе модуля сразу инжектить, а не прокидывать через контроллер, это да. Переделаю
В чем проблема написать свой интерфейс, и его реализовать?

Ad.x ??
12.03.2018
19:49:45
в том что сторонние модули не будут его реализовывать, нада прокладку пилить

Matviy
12.03.2018
19:50:07
Сторонние не будут, но речь то идет о своих модулях

Ad.x ??
12.03.2018
19:50:24
своим модулям не нужны интерфейсы )
и без них нормально
что с ними что без них у тебя будет лютый монолит... так зачем выебываться?

Matviy
12.03.2018
19:52:28
Нужны, как минимум, чтоб видеть, в чем именно зависимость
Мне уже помагало
Ну нет, я ж говорю, попробовал так делать, уже легче стало
А не-монолит - это уже разбивать на отдельные приложения разве

Ad.x ??
12.03.2018
19:59:13
по мойму проще пилить какой-то скелет, и на него накидывать всякое мясо в виде модулей
фрейм на основе фрейма :D

Dmitriy
12.03.2018
20:01:15

Matviy
12.03.2018
20:02:10
Так по-любому всегда всюду будут зависимости, или это модули, или сервисы, и т д

Dmitriy
12.03.2018
20:02:30
не будут
тот же юзер прокидывается как интерфейс