
Konstantin
28.06.2017
21:00:26
свой класс например для отправки сообщений с сайта в телегу где размещать нужно?
это же не модель

Евгений
28.06.2017
21:01:52
Это компонент
Врапер над telegram-bot-api!))

Google

Konstantin
28.06.2017
21:02:43
почему это должно быть компонентом ?
его придется в конфиге подрубать
а я хотел по типу инклюда
где надо там и подрубил

Евгений
28.06.2017
21:05:07
extends Object, тебе события не нужны, легче будет, и да, подрубил в конфиге и потом дернул где нужно и publish()
Мне кажется так идеологически правильно, плюс получаешь конфигурирование объекта как плюшку, ну и например переопределение какой-нить логики, например писать события лога по уровням в разные чат румы

Konstantin
28.06.2017
21:08:26
т.е. любой класс который ты захотел сделать не связанный с сайтом надо делать его компонентом?
а папку components в common или frontend ?
Компонент - это базовый класс, который реализует свойства, события и поведение.
Блин ( мне кажется мой класс по отправке сообщения в телеграмм не является событием и поведением

Евгений
28.06.2017
21:16:09
Где угодно, главное чтобы тебя было удобно, если используется и со стороны фронта и на беке, то коммон, если где-то в одной части, то в ней соответственно ...
да, такие вот не связанные компоненты повышают реюзабильность кода ... я например инклуды исп только для разбиения конфига на составные части для удобства, чтобы большим не был, например db redis rabbit и тд...

Михаил
28.06.2017
21:18:11
где надо там и подрубил
Подключение компонента в конфиге еще не значит, что он будет загружен. Только при первом обращении. А это и есть "где надо, там и подрубил", только с центральным конфигом

Konstantin
28.06.2017
21:19:13
yii\base\Object - я так не пробовал еще))

Google

Евгений
28.06.2017
21:19:33
Попробуй!)))

Konstantin
28.06.2017
21:21:25
ого как много у него Subclasses
это чо один из первоначальных классов ? Объект

Knock
28.06.2017
23:59:33
Привет всем, кто не спит. Столкнулся с неожиданной проблемой. Мне нужно перенести мои пхп классы из папки models в папку forms. Но почему-то когда перемещаю, он автоматом не исправляет пути. А если я это начинаю делать сам, то он попросту не видит app\models\forms. ЧЯДНТ?
Гугол, зараза, молчит.
Сорян, в подпапку forms папки models.

Quaia
29.06.2017
01:12:57

Павел
29.06.2017
02:57:59

Boris
29.06.2017
04:41:29
Анек за неуловимого Джо уже скидывали?

Санёчек
29.06.2017
05:03:34

Konstantin
29.06.2017
05:25:34
вы пользуетесь ? :
yii\behaviors\SluggableBehavior

M
29.06.2017
06:27:54
Да
Только там боль с транситерацией из коробки, надо тюнить.

Konstantin
29.06.2017
06:42:14
почему боль, оно же вроде специально и заточено под это дело

M
29.06.2017
06:50:49
Не само расширение, а правила транслитерации в i18n такие, я как-то занялся вопросом, как по уму переопределить транслитиратор, но это столько действий требовало, ппц, так что проще по месту фиксить всё.


Сергей
29.06.2017
06:59:50
Доброе утро! Почитал немного про DDD... интересно, сложно, много дискуссионных моментов :)
Хочу постепенно внедрить в проект, если я правильно понял, сервисный слой. Вижу это так:
1) Оставляем AR-модель.
2) Добавлю в приложении папку services, где будут т. н. сервисы (например, EmployeeService), в нем будут описаны все действия которые можно сделать с AR-моделью.
3) В контролере экшены будут выглядить примерно так:
… Получение сущности и проверка доступа …
try {
$entityService->anythingDo();
} catch (\Exception $e) {
… Обработка исключений …
}
… Вывод …
Покритикуйте. Облегчит ли такой подход разработку с ростом проекта или я не вижу каких-то подводных камней, которые наоборот появятся и усложнят всё?
Сейчас я действия с сущностями, которые используются в нескольких местах, тупо выношу в хелперы и вызываю... И вот от этого хочется избавиться.


Алимжан
29.06.2017
07:05:41
Доброе утро! Почитал немного про DDD... интересно, сложно, много дискуссионных моментов :)
Хочу постепенно внедрить в проект, если я правильно понял, сервисный слой. Вижу это так:
1) Оставляем AR-модель.
2) Добавлю в приложении папку services, где будут т. н. сервисы (например, EmployeeService), в нем будут описаны все действия которые можно сделать с AR-моделью.
3) В контролере экшены будут выглядить примерно так:
… Получение сущности и проверка доступа …
try {
$entityService->anythingDo();
} catch (\Exception $e) {
… Обработка исключений …
}
… Вывод …
Покритикуйте. Облегчит ли такой подход разработку с ростом проекта или я не вижу каких-то подводных камней, которые наоборот появятся и усложнят всё?
Сейчас я действия с сущностями, которые используются в нескольких местах, тупо выношу в хелперы и вызываю... И вот от этого хочется избавиться.
Насколько я помню, вроде бы вызывается сервисный слой, а не работа с сущностью напрямую

Сергей
29.06.2017
07:06:16

M
29.06.2017
07:06:31
И сущность кидай в сервис)

Google

Алимжан
29.06.2017
07:07:43
Лично у меня сейчас в проектах что-то вроде
public function actionRegister()
{
$form = new RegisterForm;
$form->setAttributes(Yii::$app->request->bodyParams);
if ($form->validate()) {
return Yii::$app->userService->register($form);
}
return $form;
}
Это REST

Сергей
29.06.2017
07:09:05
И сущность кидай в сервис)
Да, такое и хочу делать,
Идея на вид простая. Берём классический Controller + AR. И делаем Controller + Service + AR.
Controller создаёт AR-томдель, проверяет доступы и отдаёт в сервис, сервис уже выполняет все действия и если есть проблемы - вываливает исключение.
Но может что-то упускаю и не всё так просто :)

Dmitry
29.06.2017
07:10:13
В самом просто варианте - да, приблизительно так
Вместо Yii::$app->userService можно внедрять зависимостью в контроллер и писать $this->userService

Алимжан
29.06.2017
07:11:55

Dmitry
29.06.2017
07:12:14
На вкус и цвет

Алимжан
29.06.2017
07:12:25

Сергей
29.06.2017
07:12:57
А если через статический метод модели?
Employee::getService() ?

Алимжан
29.06.2017
07:13:15
@d_naumenko пользуясь случаем вопрос такой: где удобнее проверять на права доступа? В сервисном слое или в контроллере? Или может быть вообще в форме при валидации?)

Dmitry
29.06.2017
07:14:03

Сергей
29.06.2017
07:14:24

Алимжан
29.06.2017
07:15:21

Сергей
29.06.2017
07:16:56


Dmitry
29.06.2017
07:21:21
@d_naumenko пользуясь случаем вопрос такой: где удобнее проверять на права доступа? В сервисном слое или в контроллере? Или может быть вообще в форме при валидации?)
Смотря какие права :)
Есть понятие "инварианты" - это валидация бизнес-правил вроде "нельзя создать Employee, если его ИНН уже принадлежит другому Employee". Такое в контроллере не проверишь, это идет в сервисный слой.
А есть права доступа к операциям CRUD, реализующиеся через RBAC. Например "создать employee может только пользователь с permission=employee.create". Такое условие как раз хорошо описывается фильтрами в контроллере.
Кроме того, бывают комплексные операции, вроде "импорт сотрудников из файла экспорта 1С", и там permission другой: "employee.import-from-1c". Заметь, что операция импорта - это парсинг + foreach(create), а пермишн - другой. Проверяя это в контроллере, проблем не будет. А если вынести такую проверку в сервис - придётся как-то костылять, чтобы обработать импорт. Уловил? :)


HIT
29.06.2017
07:28:53
есть ли готовое решение магазина на yii2, кто что может посоветовать?

Google

Алимжан
29.06.2017
07:28:56
Смотря какие права :)
Есть понятие "инварианты" - это валидация бизнес-правил вроде "нельзя создать Employee, если его ИНН уже принадлежит другому Employee". Такое в контроллере не проверишь, это идет в сервисный слой.
А есть права доступа к операциям CRUD, реализующиеся через RBAC. Например "создать employee может только пользователь с permission=employee.create". Такое условие как раз хорошо описывается фильтрами в контроллере.
Кроме того, бывают комплексные операции, вроде "импорт сотрудников из файла экспорта 1С", и там permission другой: "employee.import-from-1c". Заметь, что операция импорта - это парсинг + foreach(create), а пермишн - другой. Проверяя это в контроллере, проблем не будет. А если вынести такую проверку в сервис - придётся как-то костылять, чтобы обработать импорт. Уловил? :)
Спасибо за развернутый ответ (: Только вот последнее туговато дошло

Dmitry
29.06.2017
07:30:31

Алимжан
29.06.2017
07:30:46
Т.е. все-таки лучше постараться все проверки делать в фильтрах/контроллере? А в сервисном слове можно проверить только для целостности?

Dmitry
29.06.2017
07:31:03
Можно иметь право импортировать, но не иметь права создавать и наоборот.

Алимжан
29.06.2017
07:31:08

Dmitry
29.06.2017
07:31:19

Алимжан
29.06.2017
07:32:54
Что значит "ВСЕ"?
Сейчас у меня все в длиннющих методах
behavoirs
:
[
'allow' => true,
'actions' => ['update'],
'roles' => ['updatePost'],
'roleParams' => ['postId' => Yii::$app->request->get('id')];
],
А внутри сервиса простая проверка по требованиям бизнес логики, где выкидывается Exception в случае ошибки.

Admin
ERROR: S client not available

Алимжан
29.06.2017
07:40:47
@d_naumenko Просто может быть есть что-то, что избавляет нас от метода
behaviors
на три экрана скролла?

Сергей
29.06.2017
07:45:31

Александр
29.06.2017
08:03:21
оберни в функцию помощник
ensureAllow...

Сергей
29.06.2017
08:04:15

Александр
29.06.2017
08:06:11
не будет ифов лишних по всем экшенам, и в будущем легко отрефакторить

Сергей
29.06.2017
08:07:51

Александр
29.06.2017
08:08:03
да, это туда и ляжет
ничего страшного в глобальных функциях нету, ускоряет разработку, если проект закрытый (не open source) - стоит однозначно использовать
еще плюс - автокомплит для кастомных компонентов, если ты не хочешь переопределять Yii класс (чтобы описывать компоненты через phpdoc), но хочешь автокомплит своих компонентов - кидаешь их в глобалы

Google

Vladislav
29.06.2017
08:10:31
какой то страшный набор костылей, удобный только их автору

Александр
29.06.2017
08:11:16
что страшного?

Павел
29.06.2017
08:11:24
А зачем это?
Может проще автокомплит IDE настроить и не париться?

Александр
29.06.2017
08:11:45
как настроить автокомплит, если IDE не знает о кастомных компонентах?
А зачем это?
Может проще автокомплит IDE настроить и не париться?

Сергей
29.06.2017
08:12:32
Если без фанатизма, то глобальные функцию в закрытом проекте - мне кажется очень удобны

Александр
29.06.2017
08:12:41
два варианта - переопределить Yii класс, и в phpdoc описывать компоненты, или использовать шорткаты
все верно
Если без фанатизма, то глобальные функцию в закрытом проекте - мне кажется очень удобны

Stepan
29.06.2017
08:13:46

Александр
29.06.2017
08:14:08
а чем это не хелперы?
а кто мешает хелперы просто юзать?

Юрий
29.06.2017
08:15:48
хотя функции там банальные

Александр
29.06.2017
08:15:58
аргументов от Павла и Владислава не услышал - возвращаюсь к работе

Stepan
29.06.2017
08:16:27
Ну например тем что не явно где они лежат и идеально будет работать автокомплит

Сергей
29.06.2017
08:16:36
if (!Yii::$app->user->can('projectParamsEdit', ['project' => $project])) {
throw new ForbiddenHttpException();
}
vs
use ххх/xxx/AccessHelper;
AccessHelper::can('projectParamsEdit', ['project' => $project]);
vs
can('projectParamsEdit', ['project' => $project]);