169 похожих чатов

Добрый день. Вот если есть контроллер для web и для

API с выборкой по многим параметрам, которые идентичны - нужно писать 2 контроллера копии? Или допустимо в API вызвать контроллер web?

Или вообще нужно метод в модели для выбора по многим условиям?

Эта модель должна билдер возвращать или результирующий массив?

38 ответов

61 просмотр

в сервис вынеси код

если речь идет о фильтрации, то присмотрись к tucker_eric eloquent filter

Александр-www Автор вопроса
Даниил
в сервис вынеси код

спасибо, получается в контроллере будет валидация, а сервис уже предполагает что данные проверены, или как?

Александр-www Автор вопроса
Даниил
в сервис вынеси код

или типа if isset or !empty ... add parameter

Александр www
спасибо, получается в контроллере будет валидация,...

не всё так просто/однозначно. валидация запроса и валидиация данных в сервисе могут быть разными. Можешь здесь немного почитать: https://github.com/adelf/acwa_book_ru/blob/master/manuscript/6-validation.md

Александр-www Автор вопроса
PSYTRGLES
не всё так просто/однозначно. валидация запроса и ...

опять Аделя книга, никак не доберусь до нее) спасибо, изучаю)

Александр www
спасибо, получается в контроллере будет валидация,...

один из ходового варианта - передавать в сервис DTO который содержит валидные данные

PSYTRGLES
один из ходового варианта - передавать в сервис D...

А что лучше использовать DTO или ресурсы? которые вот эти https://laravel.com/docs/10.x/eloquent-resources

Max
А что лучше использовать DTO или ресурсы? которые ...

DTO это паттерн, общее названия классов для передачи данных между подсистемами, применение широкое. апи ресурсы ларки, согласно их же доке, что ты скинул: When building an API, you may need a transformation layer that sits between your Eloquent models and the JSON responses that are actually returned to your application's users. имеют более конкретное предназначение, а именно ответ апишки. в целом апи ресурс это и есть dto

Ну просто у DTO же ещё формат данных можно указать и маленько не разобрался как быть с данными которые опциональные, которые могут придти, а могут и нет, а у ресурса обычный массив

Max
Ну просто у DTO же ещё формат данных можно указать...

не оч понял о каком формате речь? dto - простой класс, без логики, содержащий явные данные. может содержать как простые типы, так и другие dto. поля могут быть опциональными, чаще всего readonly, но не обязательно

Andrew🇺🇦 EmOzEmTsEv
а чем DTO от Value Object отличается?

VO содержит только 1 значение. DTO - поля и свойство. VO - только свойство.

PSYTRGLES
не оч понял о каком формате речь? dto - простой кл...

О форматах полей ну там public string $name; А потом $this->name = 'name'; Просто если не придёт то никакого string поле не получит, в этом моменте и не понимаю как сделать

PSYTRGLES
не всё так просто/однозначно. валидация запроса и ...

Интересно не совсем понятно , для чего нам выносить валидация из контролёру в другие сервисы ? Доп слой создавать

Max
О форматах полей ну там public string $name; А пот...

ну у тебя DTO имеет строгое содержание. если у тебя свойство опционально, то public ?string $name = null иначе у тебя не хватает данных, а это должно быть проверено до попытки создать DTO. ну кто-то не согласится и скажет, что он валидирует в DTO, но мое мнение, что это не правильно, дто не должно содержать доп. логики, максимум оно может содержать статические правила для валидации своих полей.

PSYTRGLES
ну у тебя DTO имеет строгое содержание. если у теб...

Спасибо, а если так напишу, то потом же как то надо вычищать все null из объекта, чтобы не болтались. Или случайно их в базу не записать, где есть nullable поле при обновлении.

jaygen
Интересно не совсем понятно , для чего нам выносит...

в контроллере, в ларке, используем FormRequest - валидируем входящие данные в запросе и обрабатываем ошибки для пользователей. дальше используем входящие данные как валидные. но, не в контроллере мы же пишем саму логику, и это называется сервисным слоем - классы которые что-либо делают конкретное, решают бизнес-задачи. И мы передаем эти данные в какой-то класс (сервис, экшен, команду, таск). И здесь вопрос - как мы можем доверять данным переданным в сервис, внутри сервиса? Вдруг кто-то вызовет этот сервис где-то еще и вручную передаст данные, или не провалидирует их? У Аделя эта проблема вроде норм расписана, если не вник, попробуй перечитать, на практике пописать. Если кратко, то дто гарантирует что внутри сервиса мы работаем с конкретными и валидными данными, например: $data = [user_id => 1, status => 0]; // какой-то массив данных из запроса $service->handle($data); pubf handle(array $data) { $data['user_id'] // мы не уверены, что существует такой ключ в массиве, мы вообще не уверены о содержимом $data, кроме того что это массив, но массив чего мы не знаем никогда и это придется всё проверять. } pubf handle(AnyDto $data) { $data->user_id; // мы точно знаем что у AnyDto есть свойство user_id и что оно int. }

Max
Спасибо, а если так напишу, то потом же как то над...

ну это не связанные с DTO моменты. как тебе надо так и используй. если ты про то что $model->update($dto->all()); то такое се. но, конечно, ты можешь сделать базовый дто или трейт, где будет метод toArray() и любой другой, например, $dto->excludeEmpty() (название не очень), хотя такое на практике мне не нужно было, возможно, просто достаточно немного свой код пересмотреть. тут вопрос такой: почему null тебе надо исключить? а если null надо записать в бд?

Max
Спасибо, а если так напишу, то потом же как то над...

Если я правильно понял суть разговора, то я иногда в самой дтошке пишу метод toModelData():array и возвращаю массив, который можно передать в Model::create($dto->toModelData()). Конечно немного противоречит сути дто, но весьма удобно. В принципе ничего не мешает сделать этот метод и в самом сервисе приватным методом.

PSYTRGLES
ну это не связанные с DTO моменты. как тебе надо т...

Вот как раз так и делаю что update и весь dto, а как правильно делать, тоже по полям указывать? При обновлении точно нигде не требуется записать, при создании nullable поле само запишет null если его нет. Почему исключить надо, потому что с разных мест разные данные приходят, а так как таблица одна, то и dto общее

Andrew🇺🇦 EmOzEmTsEv
а чем DTO от Value Object отличается?

VO - это такой способ обыграть несуществующие в языке типы данных. например: Email, номер телефона, координаты, валюта. так наверное будет правильнее, я там выше сказал, что одно свойство, скорее логическое свойство. т.е. если говорить про координаты, то будет два поля - широта и долгота.

Никита
Если я правильно понял суть разговора, то я иногда...

Если противоречит тогда не, не подходит

Max
Вот как раз так и делаю что update и весь dto, а к...

ну если у тебя есть поле phone nullable. если ты не передал его в запросе - его не надо обновлять, если передал null, то его надо удалить, т.е. записать в null. т.е. по разному можно трактовать

Всё, ещё больше запутался, как то не учёл такие случаи, когда действительно надо будет убрать

Max
Всё, ещё больше запутался, как то не учёл такие сл...

как делают: - передают всегда все данные и обновляют их, даже если они не изменились - передают только те данные которые надо изменить - добавляют в запросы флаги для очистки (обычно используется, когда надо удалить файлы), т.е. например аватарку можно загрузить новую и она заменит старую, а можно просто удалить, а можно ничего не менять, но при этом отправлять форму для изменения имени и других данных.

PSYTRGLES
как делают: - передают всегда все данные и обновля...

первый вариант в скоупе с ёлкой - норм. просто, жирно, не напряжно

PSYTRGLES
как делают: - передают всегда все данные и обновля...

Спасибо большое тогда добавлю флаги и буду по ним определять надо ли в базу писать или нет

Max
Спасибо большое тогда добавлю флаги и буду по ним ...

ну это ближе к костылю. в чем проблема отправлять только те данные, которые ты хочешь изменить?

PSYTRGLES
ну это ближе к костылю. в чем проблема отправлять ...

Потому что как ранее сказал DTO общее, вот например в одной форме пароль меняется с проверкой старого, в другой форме имя пользователя, отправляются получается разные данные, а DTO одно потому эта сущность пользователя, поменяю тоже имя, пароль в таком случае необязательным полем становится, а значит получит null, в этом и проблема возникает, что мне его не надо трогать и наоборот когда меняю пароль, имя необязательное

PSYTRGLES
ну это ближе к костылю. в чем проблема отправлять ...

Если всем сделаю public ?string $name; public ?string $password; То тоже будет похоже на костыль

Max
Потому что как ранее сказал DTO общее, вот наприме...

ну пароль - да, можно фильтровать, у тебя скорей всего не может быть такого, что пароль будет null, следовательно, если его нет, то он не изменяется. для остальных полей надо рассматривать варианты. иногда еще делают (в ларке можно тоже такое найти), как вместо null вешается какой-то класс, например Empty, т.е. можно так обыграть, что все поля содержащие этот тип данных - должны быть очищены. а null - отфильтрованы и не изменяться. Но надо на месте смотреть. другой варик - разные DTO, разные сервисные методы/классы.

Александр-www Автор вопроса
PSYTRGLES
не всё так просто/однозначно. валидация запроса и ...

блин когда читаешь это всё, понимаешь что вообще неправильно всё делал.....

PSYTRGLES
ну пароль - да, можно фильтровать, у тебя скорей в...

С классом да какие-то решения встречал, когда свой вопрос гуглил до того как сюда написать, тоже попробую, ещё раз спасибо

Александр www
блин когда читаешь это всё, понимаешь что вообще н...

да, это ощущение не проходит ))) всегда есть за и против любого решения.

Похожие вопросы

Обсуждают сегодня

30500 за редактор? )
Владимир
47
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Подскажите пожалуйста, как в CustomDrawCell(Sender: TcxCustomGridTableView; ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean); получить наз...
A Z
7
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
1
Он в одиночку это дело запилил или была какая-то команда?
Aquinary
12
~ 2m21s  nix shell github:nixos/nixpkgs#stack ~  stack ghc -- --version error: … while calling the 'derivationStrict' builtin at /builtin/derivation.nix:...
Rebuild your mind.
6
Всем привет, нужна как никогда, нужна помощь с IO в загрузчике. Пишу в code16 после установки сегментных регистров, пишу вывод символа. Пробовал 2 варианта: # 1 mov $0x0E, %a...
Shadow Akira
14
Карта сайта