Тёмный

Laravel-data от Spatie: просто и со вкусом! Описание библиотеки. 

through the Eyes of a freelancer
Подписаться 2,7 тыс.
Просмотров 2,7 тыс.
50% 1

Опубликовано:

 

11 окт 2024

Поделиться:

Ссылка:

Скачать:

Готовим ссылку...

Добавить в:

Мой плейлист
Посмотреть позже
Комментарии : 20   
@erbolat_wq1937
@erbolat_wq1937 Год назад
Отлично!!! Спасибо. возник вопрос если мы можем использовать laravel-data как FormRequest как быть в ситуациях когда при создании одно поле required в при редактировании nullable? например при создании пользователя поле password у нас обычно required а вот если хотим обновит нет, мы даже можем не передать поле password, как в таких случаях использовать один класс UserData для валидаций?
@forestlynx
@forestlynx Год назад
Добрый. Например как было сказано в видео использовать MapInputName. Или валидировать посредством RequiredWithout
@erbolat_wq1937
@erbolat_wq1937 Год назад
@@forestlynx Привет, возможно я пока не совсем понимаю как с помощью RequiredWithout и MapInputName решит проблему но не думаю что они нам поможет. Если есть примеры скинь пжл.
@freelancer_eyes
@freelancer_eyes Год назад
Привет, Ерболат! Смотри, в самом простом случае чем отличается создание от редактирования? При создании у нас ещё нет ID, а при редактировании - есть. Поэтому рауты обычно так и выглядят: Route::post('/users', [UserController::class, 'create']); Route::put('/users/{id}', [UserController::class, 'update']); Тогда что мы можем сделать? Мы можем добавить в наш UserData: #[FromRouteParameter('id')] public ?int $id; #[RequiredWithout('id')] public ?string $password; Обрати внимание, что оба поля - nullable, то есть, не required вообще-то. Понимаешь, как это будет работать? Если вызовется route create, поле id не будет заполнено. А значит сработает правило RequiredWithout('id') для пароля А если вызовется route update, то id заполнится из раута и поле password станет не-required. Понимаешь идею?
@erbolat_wq1937
@erbolat_wq1937 Год назад
@@freelancer_eyes Добрый день. да теперь понял я почему-то не подумал об этом. Спасибо
@АнтонСурыгин-ф9ж
@АнтонСурыгин-ф9ж 5 месяцев назад
Спасибо за материал! Все доступно и понятно. Приятная подача. Мне как новичку, не хватило информации как делать свои кастомные сообщения на ошибки валидации.
@ДмитрийПавлович-о8н
Очень интересно вас слушать! Спасибо за ваше время!
@freelancer_eyes
@freelancer_eyes Год назад
Спасибо вам за интерес и поддержку!
@АртурЗарипов-б2й
@АртурЗарипов-б2й 6 месяцев назад
Большое спасибо!
@kind1y
@kind1y 11 месяцев назад
Видео просто бомбяо, всё подробно и понятно. Хорошо, что повстречал этот канал :)
@farrashh
@farrashh 9 месяцев назад
Доброго дня! Большое спасибо за видео, очень доступно и понятно! От меня скромное пожелание для будущего видео. Хотелось бы узнать, как готовить свои касты и трансформы в данном пакете, для меня достаточно загадочно использование параметров DataProperty и $context в public function cast(DataProperty $property, mixed $value, array $context): mixed PS сам использую этот пакет для json полей. Пока это одно поле, настройки пользователя, - временная зона, аватар, предпочтительная цветовая схема и т.п. - то, что не требует поиска, а потому нет смысла для каждой настройки создавать отдельное поле и миграцию, тем более они будут модифицироваться в будущем. Прописывать их все в одном месте - Data классе - то, что нужно для меня, ИМХО.
@SerafimArts
@SerafimArts 8 месяцев назад
Секта святого шпателя изобрела симфони))) kekw
@dmitry4241
@dmitry4241 7 месяцев назад
Так это все есть в Response ! Кроме того, там можно добавлять логику. Обработку. Добавлять связи с подчиненными таблицами. Из одного массива создавать коллекции. Ну и интеграция с тестами!!! Пример из документации это 1% от возможностей.
@forestlynx
@forestlynx Год назад
Добрый день! Начал углубляться в пакет и возникла сложность например во входных данных мы можем иметь число, строку или объект(массив). Вот три варианта входных данных: {"status": { "name": "ACTIVE", "value": 1, "label": "Действующая" }, "legal_form": "LEGAL", "branch_type": 1} В классе DTO унаследованного от класса Data пакета в конструкторе определяю свойства: public EnumDTO $status, public EnumDTO $legal_form, public EnumDTO $branch_type класс EnumDTO так же унаследован от пакета имеет структуру: public function __construct( public string $name, public int $value, public string $label, ) { } По итогу проходит только свойство $status, т.к. его структура соответствует классу EnumDTO, остальные свойства не проходят валидацию. Пытался через WithCast(EnumCastData::class, type: ...::class): class EnumCastData implements Cast { public function __construct(protected ?string $type) { dump($this); } public function cast(DataProperty $property, mixed $value, array $context): EnumDTO | CannotEnumCast { dd($value); } } До dd() не доходит, как я понимаю при инициализации $value происходит приведение ее к типу EnumDTO и тут соответственно происходит ошибка валидации. При трансформации та же проблема. Подскажите как можно решить такую задачу.
@forestlynx
@forestlynx Год назад
В общем очень странное поведение. Первое что проверил исключил внедрение зависимости DTO класса в контроллере, получаю обычный Request и на его основе, получив все поля, через статический метод from создаем DTO при этом преобразование срабатывает. Второй вариант, в классе DTO свойство, в моем случае c типом EnumDTO, исключить из проверки (#[WithoutValidation] public EnumDTO $status). Третий вариант, создать в DTO магический метод public static function fromRequest(Request $request): static {return new self(request->all());} (этот вариант не проверил но из документации к пакету такая возможность имеется). Думал что это могло зависеть от заголовков запроса, в частности от параметра Accept но он у меня изначально верно указан имеет значение: application/json. Так и не понял почему происходит такое поведение при внедрении зависимости DTO, хотя судя по документации при внедрении зависимостей преобразование должно срабатывать.
@garajmoryak
@garajmoryak Год назад
Почему не делаете выпуски про Symfony?
@freelancer_eyes
@freelancer_eyes Год назад
Я уже года два не использовал Symfony (хотя очень люблю этот фреймворк). Просто не подбрасывал таких задач работодатель. Соответственно, немножко подотстал от поезда, не знаю, что там нового и какие тенденции. Если придётся опять столкнуться с этим монстром - с удовольствием расскажу о свежих впечатлениях.
@c0ntrall472
@c0ntrall472 7 месяцев назад
На счет того, чтобы класс мог называться каноничным с точки зрения ООП - разве камень не будет объектом в реальной жизни? Он имеет свойства, но не имеет поведения. ООП вроде бы как и было придумано как аналогия реальным объектам! Или я ошибаюсь?
@ak_kvadrat
@ak_kvadrat Год назад
По описанию не очень понимаю потребность в этой библиотеке, вся эта функциональность (кроме генерации тайпскриптовых файлов) уже есть в laravel, и часто, если приложение сложнее чем CRUD моделей, структура данных которые мы принимаем отличается от структуры которую отдаем, разве что единый синтаксис для всего этого. Попробую на практике))
@freelancer_eyes
@freelancer_eyes Год назад
Я начал использовать некоторое время назад. Мне нравится, что всё можно описать в едином синтаксисе. Просто публичные свойства, обвешанные аннотациями. Да, иногда приходится приплясывать, если инпут/аутпут различаются. И я ещё не разобрался во всех возможных путях разрешения этих вопросов. Но то, что все структуры данных хранятся в одном месте и единообразны - мне таки очень нравится
Далее
[ENG sub] Closures in PHP.
23:01
Просмотров 2,6 тыс.
Introducing spatie/laravel-data
21:17
Просмотров 10 тыс.