Спасибо за уроки! src/Shared/Domain/Security/AuthUserInterface.php AuthUserInterface зависит от Symphony/Component/Security/Core/User/UserInterface. Получается, что доменный слой имеет какие-то внешние зависимости от фреймворка)
Да. С интерфейсами все сложно. Можно упороться и вынести функционал атворизации в отдельный модуль ради архитектурной концепции, написать свой провайдер и хэшер. И скрыть в итоге эту горечь. Но в данном случае это только добавит технической сложности и мы не сильно выиграем придеживаясь жестких ограничений. Да и видео получилось бы слишком раздутым и непонятным :) Мы попробуем причесать код в рамках урока, когда будем выносить функционал авторизации в отдельный микросервис. Но пока ... Как миниммум мы понизили связанность с фреймворком на уровне отдельного интерфейса. Было бы хуже дабавлять интерфейс фоеймворка прямо в Entity. Вообще с интерфейсами и структурами стоит соблюдать баланс, чтобы не певратилось в горе о ума :) Если мы отходим от постулатов и дейстительно выигрываем в плане эффективности и скорости разработки, при этом по возможности снизив связанность с фрейморком, скорее всего, это разумный путь :)
Большое спасибо за уроки! Единственное, что осталось неясно - почему нужно регистрировать контроллер для /users/me? По какой причине HealthCheck отрабатывал без дополнительной регистрации? UPD. И почему в консольной команде используется фабрика, а не команда, созданная на прошлом уроке?
А если есть соседний контекст (говоря про DDD), в котором происходит работа, например с постами И нужно получить список постов, которые соответствуют авторизованному пользователю, то как передать информацию о авторизованном пользователе в этот соседний контекст?
Если обращение к контексту с постами идет из соседнего контекста, то следует передавать идентификатор пользователя через предохранительный уровень (Anticorruption Layer). Это может быть адаптер к модулю постов. И в адаптере метод getPostsByUser(userId).
Спасибо за урок. Но. если честно, AuthUserInterface в домене наследоваться от симфони эт не верный подход. Как я понял мб эт для простоты конечно. Но вот setPassword с хешем, эт как-то перебор с нарушением ООП. В целом, хочется побольше твоих видео глянуть, т.к. годной инфы по ДДД мало. Да и не каждый пытается выстроить такую архитектуру. За это тоже отдельное спасибо!
у меня была 500 пока не выполнил команду make jwt (что бы шифрование начало работать), и надо не забыть сделать make db_migrate (что бы была БД со списком пользователей)
Схоже на нових версіях бібліотек треба по іншому конфігурувати, після даунгдейду до версій як у Олександра все запрацювало, а на актуальних - нічого не працює, починаючи з пустих міграцій і навіть якщо їх закинути вручну - то тести все одно падають з помилками, каже що не бачить такої таблиці хоча вона є, при тому що інші тести відпрацьовують ``` bash-5.1$ php bin/phpunit PHPUnit 9.6.10 by Sebastian Bergmann and contributors. Testing ...[critical] Uncaught PHP Exception Doctrine\DBAL\Exception\TableNotFoundException: "An exception occurred while executing a query: SQLSTATE[42P01]: Undefined table: 7 ERROR: relation "refresh_tokens" does not exist LINE 1: ...ername_2, t0.valid AS valid_3, t0.id AS id_4 FROM refresh_to... ^" at /var/www/vendor/doctrine/dbal/src/Driver/API/PostgreSQL/ExceptionConverter.php line 71 E.. 6 / 6 (100%) Time: 00:14.388, Memory: 38.00 MB ``` схоже що спочатку потрібно мені розібратися із базою сімфоні
Уроки, менторство - boosty.to/sashokgorshok
пожалуй это видео сохраню, понятно и доступно объяснено, спасибо !👍
Спасибо за уроки!
src/Shared/Domain/Security/AuthUserInterface.php AuthUserInterface зависит от Symphony/Component/Security/Core/User/UserInterface. Получается, что доменный слой имеет какие-то внешние зависимости от фреймворка)
Да. С интерфейсами все сложно. Можно упороться и вынести функционал атворизации в отдельный модуль ради архитектурной концепции, написать свой провайдер и хэшер. И скрыть в итоге эту горечь. Но в данном случае это только добавит технической сложности и мы не сильно выиграем придеживаясь жестких ограничений.
Да и видео получилось бы слишком раздутым и непонятным :)
Мы попробуем причесать код в рамках урока, когда будем выносить функционал авторизации в отдельный микросервис.
Но пока ...
Как миниммум мы понизили связанность с фреймворком на уровне отдельного интерфейса. Было бы хуже дабавлять интерфейс фоеймворка прямо в Entity.
Вообще с интерфейсами и структурами стоит соблюдать баланс, чтобы не певратилось в горе о ума :)
Если мы отходим от постулатов и дейстительно выигрываем в плане эффективности и скорости разработки, при этом по возможности снизив связанность с фрейморком, скорее всего, это разумный путь :)
@@AlejandroYakovlev Спасибо за развернутый ответ. Ждем следующих видео)
Спасибо за лекцию. Мне одному кажется, что при обновлении access token надо обновлять и refresh_token?
Большое спасибо за уроки!
Единственное, что осталось неясно - почему нужно регистрировать контроллер для /users/me? По какой причине HealthCheck отрабатывал без дополнительной регистрации?
UPD. И почему в консольной команде используется фабрика, а не команда, созданная на прошлом уроке?
Не понял как используются public and private ключи сгенерированные вначале видео при настройки бандла?
Зачем в сущности User делать проверку пароля на null, и после этого все равно выполнять хеширование? Или это просто невнимательность?
А если есть соседний контекст (говоря про DDD), в котором происходит работа, например с постами
И нужно получить список постов, которые соответствуют авторизованному пользователю, то как передать информацию о авторизованном пользователе в этот соседний контекст?
Если обращение к контексту с постами идет из соседнего контекста, то следует передавать идентификатор пользователя через предохранительный уровень (Anticorruption Layer). Это может быть адаптер к модулю постов. И в адаптере метод getPostsByUser(userId).
У урока есть гитхаб?)
под семерку прилично так устарело
@@fugitive9612 а под 5 или 6?
Спасибо за урок. Но. если честно, AuthUserInterface в домене наследоваться от симфони эт не верный подход. Как я понял мб эт для простоты конечно.
Но вот setPassword с хешем, эт как-то перебор с нарушением ООП.
В целом, хочется побольше твоих видео глянуть, т.к. годной инфы по ДДД мало. Да и не каждый пытается выстроить такую архитектуру. За это тоже отдельное спасибо!
Почему UserPasswordHasher не хранится в папке Service, в просто в папке Infrastructure?
Правильно будет хранить в Service
Вопрос: почему без юнит тестов? Не считаете необходимым в рамках курса или еще будут? Спасибо!
Верно, в рамках курса юнит тесты избыточны и могут отвлечь от самого главного. Функциональные же помогают доказать, что функционал является рабочим.
Как выясняется, тесты мало кто пишет из начинающих, поэтому просмотры к таким видео сильно падают.
src/Shared/Damain/ Может Domain?
Спасибо за наблюдательность. Поправлю.
@@AlejandroYakovlev Это тебе спасибо за уроки, только продолжай, не забивай на полпути!
У кого-то при тестировании login тест 404 отдает?
у меня была 500 пока не выполнил команду make jwt (что бы шифрование начало работать), и надо не забыть сделать make db_migrate (что бы была БД со списком пользователей)
В Symfony дела лучше обстоят для реализации OAuth2 чем в NestJs(
Согласен
А можно в следующий раз лицо не снимать?) Я отвлекаюсь
Поздравляю с 8 марта :)
Схоже на нових версіях бібліотек треба по іншому конфігурувати, після даунгдейду до версій як у Олександра все запрацювало, а на актуальних - нічого не працює, починаючи з пустих міграцій і навіть якщо їх закинути вручну - то тести все одно падають з помилками, каже що не бачить такої таблиці хоча вона є, при тому що інші тести відпрацьовують
```
bash-5.1$ php bin/phpunit
PHPUnit 9.6.10 by Sebastian Bergmann and contributors.
Testing
...[critical] Uncaught PHP Exception Doctrine\DBAL\Exception\TableNotFoundException: "An exception occurred while executing a query: SQLSTATE[42P01]: Undefined table: 7 ERROR: relation "refresh_tokens" does not exist
LINE 1: ...ername_2, t0.valid AS valid_3, t0.id AS id_4 FROM refresh_to...
^" at /var/www/vendor/doctrine/dbal/src/Driver/API/PostgreSQL/ExceptionConverter.php line 71
E.. 6 / 6 (100%)
Time: 00:14.388, Memory: 38.00 MB
```
схоже що спочатку потрібно мені розібратися із базою сімфоні