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

Еще один вопрос позвольте. Куда обычно вы выносите работу с

моделью из контроллера? В репозиторий класс (как сервис)?

32 ответов

16 просмотров

не то, чтобы я был экспертом, но подобную логику я оставляю в контроллере без проблем. а вот валидацию всегда выношу в Request классы. ну и да, time+extension это риск перезаписи файлов, которые были загружены одновременно.

Довольно странно читать это на канале Laravel Pro

Фартовый Фарт
Довольно странно читать это на канале Laravel Pro

это вполне нормальный вопрос, вообще по больше бы таких со здравыми комментами. всегда интересно посмотреть кто и как делает. я с ларой пару лет, до этого мыслил симфонией, игнитером, yii, собственными фреймворками на заре разработки итп, но даже с с многолетним опытом в php у меня бывают глупые вопросы по ларе, просто убедиться, как кто делает и почему. можно считать себя про, но без обмена опытом, это про на уровне 127.0.0.1, не дальше

Trin Zotoff
это вполне нормальный вопрос, вообще по больше бы ...

Я не сказал, что вопрос не нормальный, мне кажется, что это уровень новичка. Ваш ответ меня так же удивил.

Фартовый Фарт
Я не сказал, что вопрос не нормальный, мне кажется...

я не использую сервисы, предпочитая либо прописывать логику в контроллере, либо частую логику выносить в модели/ивенты. меня наоборот смутило, что кто-то пишет валидацию в контроллере. в этом же и прелесть, каждый меняется опытом, рассказывает как у него, в итоге складывается картина, как кто делает, почему и для чего. слышал, что по уму всё это выносить в сервисы, всю работу с моделью. посмотрел реализацию, мне не зашло, продолжаю писать логику в контроллерах, ибо как по мне, там ей и место, по крайней мере для меня. Опять же, часть логики в ивентах, часть в моделях, но в общем случае я не вижу смысла создавать сервис для сохранения одного параметра, условно. буду рад, если вы расскажете для чего это делаете вы, вполне вероятно, что я передумаю ) например у меня лара только api, фронт на реакте и я не использую livewire или шаблоны стандартные итп. мне проще написать реакт приложение, которое общается с ларой исключитьно по http/websocket апи. слой http закрывают контроллеры, слой websocket закрывают ивенты и броадкаст. для меня намного важнее описать каждый реквест (валидацию) в отдельном файле. даже те параметры, которые могут быть, а могут не быть, я описываю в реквесте, типа 'checkbox' => ['nullable']

Trin Zotoff
я не использую сервисы, предпочитая либо прописыва...

Смотрите, Вы так красочно описали валидацию, заметили, что она должна быть в отдельном классе, и тут же соглашаетесь с тем, что какая то логика содержится в контроллере.. Мне так же хотелось бы прочесть ответы профи по ларе.. Это всё же канал PRO, а не для начинающих..

Фартовый Фарт
Смотрите, Вы так красочно описали валидацию, замет...

я поэтому и написал, что какие-то вещи для меня важны и я понимаю, почему они для меня важны и поэтому их юзаю, например реквесты. при этом я не понимаю, зачем мне выводить логику с моделью из контроллера, который этой логикой по сути и рулит. поэтому на вопрос человека, выносить это в сервисы или нет, я и ответил, что лично я не выношу, а вот реквест бы вынес. я на php пишут с 3-ей его версии, я видел много реализаций и да, laravel сейчас мне кажется самым удачным инструментом, который задаёт высокую планку для других языков. инструментов уровня laravel нет ни в го ни в питоне, ни тем более в nodejs, который я тоже люблю. и эта группа, я надеюсь, создана для обмена опытом ) вопрос был новичка в ларе, но не факт, что человек новичёк в разработке. понятно, что есть паттерны разработки и прочее, но так же есть задачи, которые нужно реализовывать. если метод контроллера, который создаёт сессию для файла (как пример в вопросе у топикстартера) это условно единственное место, где это делается, я не вижу причины выносить это в сервис. и буду рад услышать, что я не прав, если мне объяснят почему. если проект реализуется через сервисы, очевидно, они нужны и для одного случая, да. я привык делать методы контроллеров таким образом, чтобы действия в моделях были уникальными, либо делались через ивенты. я не доказываю свою правоту, я пришёл к этому выводу в процессе разработки и могу ошибаться )

Фартовый Фарт
Смотрите, Вы так красочно описали валидацию, замет...

ну и потом, этот канал получил приписку Pro когда, день назад? два? неделю? я подписался, когда он был без этой приписки

Trin Zotoff
я поэтому и написал, что какие-то вещи для меня ва...

Хм, поделюсь своим опытом, раз знатоки молчат =) Задача контроллера вернуть ответ и всё. Логика же должна находится где либо ещё! К примеру, есть такая CMS как Opencart, хуже **** придумать сложно! Там контроллеры достегают 10к и более строк. Чтобы разобраться в этом, уйдут месяцы! Там нет ни каких всем известных принципов. Сервисный слой не панацея! Но как отдушина, это имба. Есть такой шаблон как Porto, шикарная вещь, только не стоит смотреть на реализацию Apiato

Фартовый Фарт
Хм, поделюсь своим опытом, раз знатоки молчат =) З...

вы обещали поделиться собственным опытом и ссылаетесь на другие реализации. хорошо хоть вордпресс не вспомнили ) большие контроллеры зло, в этом я с вами согласен, но в погоне за нормализацией можно потерять берега. в примере автора, очень простой контроллер

Trin Zotoff
вы обещали поделиться собственным опытом и ссылает...

Так или иначе мы начинаем пользоваться чей-то реализацией! Любой шаблон, это чья то реализация.. Что касается скрина, я бы вынес проверку в соответствующий класс и туда добавил вызов класса ДТО. Сохранение картинок это однозначно отдельный класс.

Фартовый Фарт
Так или иначе мы начинаем пользоваться чей-то реал...

даже если это единственное место в проекте, где есть сохранение картинок? ))) про реализацию полностью с вами согласен, я долгие годы посвятил оптимизации mysql, есть вещи, которые мне непонятны в ларе. я видел PR, где парень предлагал адекватное решение, которое убирает updated_at из timestamps(), т.к. оно там не нужно. и где тейлор писал, что это протеворечит философии лары. прав ли тот парень в плане оптимизации mysql — очевидно. есть кейсы, где тебе не нужен updated_at в моделе и где он будет занимать 4 байта лишних данных на каждую строку в базе. прав ли тейлор? очевидно ) это скорее узкое требование для высоконагруженных систем, которое проще реализовать иначе, нежели чем внедрять в лару (хотя я бы поспорил). поэтому да, мы все следуем правилам, которые нам навязали.

Trin Zotoff
даже если это единственное место в проекте, где ес...

Да, однозначно! Отдельный класс для загрузки. Мы не можем знать, кто после придёт теребонькать эту загрузку.

Фартовый Фарт
Смотрите, Вы так красочно описали валидацию, замет...

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

Фартовый Фарт
Да, однозначно! Отдельный класс для загрузки. Мы н...

ок, соглашусь, если весь проект построен на сервисах, а в одном месте модель меняется в контроллере, это странно ) и не очевидно. с другой стороны, если модели всегда меняются в контроллерах, нет смысла выносить их в сервисы.

Andrey Manzadey
Если контроллер простой и в нем нет дублирующего к...

Мы так же не можем знать на перёд, какая задча будет завтра.

Andrey Manzadey
Если контроллер простой и в нем нет дублирующего к...

Скорее всего, мы не можем знать как будет приложуху развиваться

Andrey Manzadey
Если контроллер простой и в нем нет дублирующего к...

это скорее как стоять на красный светофор ночью в небольшом городе при отсутствии траффика. вроде как правила, но с другой стороны полная чушь. а с третьей стороны — не сложно. скорее если принято так делать в команде — проблем с этим быть не должно. у меня лично так не принятно, поэтому мне это странно

Фартовый Фарт
Мы так же не можем знать на перёд, какая задча буд...

преждевременная оптимизация — крень всех зол. (с) дональд кнут

Фартовый Фарт
Мы так же не можем знать на перёд, какая задча буд...

Завтра и вынесешь в сервис если потребуется )

Andrey Manzadey
Завтра и вынесешь в сервис если потребуется )

+1, решай проблемы по мере их поступления. иначе можно 6 дней тратить на реализацию фичи, которая заняла бы 1 день, а в итоге она окажется вообще ненужной. переделывать тоже бесит, но чаще всего ты, как разработчик, понимаешь наперёд, потребуется оно дальше или это просто прихоть бизнес-аналитиков

Andrey Manzadey
Завтра и вынесешь в сервис если потребуется )

А почему бы сразу не выкинуть в отдельный класс для маштабируемости?

Trin Zotoff
+1, решай проблемы по мере их поступления. иначе м...

Согласен. Иногда разработчик может и не понимать и не знать на перед и, возможно, усложнит простую задачу более сложной реализацией.

Andrey Manzadey
Согласен. Иногда разработчик может и не понимать ...

За частую так и есть! Но что тебе мешает выкинуть в отделку? В этом и есть решение

Trin Zotoff
даже если это единственное место в проекте, где ес...

там, где он не нужен, просто: class MyModel extends Model { const UPDATED_AT = null; } и поле из таблицы можно выносить на мусорку =)

Maxx
там, где он не нужен, просто: class MyModel extend...

попробую. пол года назад читал PR на эту тему, тэйлор высказался, что это противоречит философии. в миграции вместо timestamps руками создаёте created_at?

Trin Zotoff
попробую. пол года назад читал PR на эту тему, тэй...

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

Maxx
у меня обычно постгрес с триггерами, функциями, и ...

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

Trin Zotoff
я от триггеров отошёл, был крупный проект, который...

да, я б тоже побоялся пихать "кучу логики" в триггеры. но тоже видел проекты, где без этого было бы очень грустно, и народ нормально в принципе справлялся =)

Maxx
да, я б тоже побоялся пихать "кучу логики" в тригг...

ну опять же, тема вечера "везде хорошо своё решение". где-то без логики в мускуле можно и нужно справляться. а где-то просто глупо без неё

Trin Zotoff
я поэтому и написал, что какие-то вещи для меня ва...

Почему такие интерсные обсуждения ночью происходят?) Тож интересно мнение остальных. Сам тоже кучу времени потратил в поиске какого-то баланса как правильно и как мне было бы не больно =). Пока держу в голове что контроллер лишь посредник, можно сказать менеджер которому пришли данные и он должен передать одному ответственному работнику и получить с него результат. Если задача простая (поменять адрес на сайте) и он знает конкрентного ответственного работника (модель), то тут наверно все просто должно быть. Если же для задачи нужно несколько работников (дизайнер, фронт, бэк, девопс), то уже делают пул работников со своим менеджером(сервис) и контроллер-менеджер общается только с ним. И таких пул менеджеров уже как-то можно мониторить, тестировать и все в таком духе. Как результат главный менеджер не забивает голову логикой и тем более не общается с большим кол-ом работников. Но наерно опять же все зависит насколько большая компания и может ли она себе позволить такую иерархию. Аналогия наверно так себе) При прямом бесконтрольном общении контроллера с моделью большой риск что со временем/задач или контроллер начнет расти или модель начнет набирать много сомнительной логики. YAGNI, DRY, KISS, SOLID и тп все конечно стараешься в голове держать, но... 😏

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

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

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Ребят в СИ можно реализовать ООП?
Николай
33
Подскажите пожалуйста, как в CustomDrawCell(Sender: TcxCustomGridTableView; ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean); получить наз...
A Z
7
Карта сайта