Antonio
говорю же, при подключении сервиса все работает нормально, где нужно не только получать эту модель, но и осуществлять некоторые смежные действия, я подключаю весь сервис.
Antonio
но чаще всего мне надо работать с объектом. И получается, что я сначала получаю переменную $rateService. Затем в другую переменную получаю $currentRate = $rateService->getRate(); и потом уже работаю с $currentRate. Почему бы не инжектить ее сразу, если есть такая возможность? Или я что-то неправильно понял?
Dmitry
но чаще всего мне надо работать с объектом. И получается, что я сначала получаю переменную $rateService. Затем в другую переменную получаю $currentRate = $rateService->getRate(); и потом уже работаю с $currentRate. Почему бы не инжектить ее сразу, если есть такая возможность? Или я что-то неправильно понял?
ну вот видишь, сам о писал проблему. Сервис должен вернуть тебе готовые данные. А ты громоздишь логику в контроллере. Сделай сервис который вернет тебе просто готовые данные, и сам у себя там разберется что такое $currentRate. Биндинг переменной не очень тебе подойдет потому что переменная должда быть инициализированная до биндинга. Т.е. тебе на любой запрос придется рассчитывать $rateService->getRate();
Antonio
$rateService->getRate(); - возвращает нужные данные. В контроллере нет дополнительной логики.
Dmitry
$rateService->getRate(); - возвращает нужные данные. В контроллере нет дополнительной логики.
т.е. ты эти данные сразу во view передаешь view()->with('rate', $rateService->getRate()) ?
Antonio
т.е. ты эти данные сразу во view передаешь view()->with('rate', $rateService->getRate()) ?
не всегда. Иногда эти данные (модель) надо привзязать к другим моделям при сохранении, или сравнить с чем-то. Ну или если используется в другом сервисе, то на основе этих данных провести доп вычисления
Dmitry
не всегда. Иногда эти данные (модель) надо привзязать к другим моделям при сохранении, или сравнить с чем-то. Ну или если используется в другом сервисе, то на основе этих данных провести доп вычисления
вот, это все бизнес логика, когда ты начинаешь задумываться о том что следующиему сервису надо получить данные, а что будет если getRate не вернет ничего, или кинет эксепшен и так далее
Dmitry
поэтому цепочка в контроллере должна быть проста, пришли данные из реквеста, я их кинул в сервис он мне дал данные готовые, я их в вьюху передал. Все на этом его обязанности закончились
Antonio
хорошо. Пришли данные из реквеста, если чего-то не хватает, то эти данные генерятся вот этим сервисом, а дальше передаются в сервис, который вернет мне данные для отображения.
Antonio
но предположим я понял твою идею, что в контроллере должен дергаться только один сервис, который в свою очередь дернет все остальное
Dmitry
это его дело, он должен думать
Эмин
в контроллере из одной точке вы должны передавать данные во вью, должен быть один сервис который посмотрит - данные есть - используем, если их нет - передать кому то - получить ответ - используем
Antonio
но это не отменяет того факта, что в остальных сервисах (а их скорее всего будет несколько) мне всеравно надо будет подключать сервис RateService в переменную $rateService и только потом получать данные. Почему не дергать эти данные сразу?
Эмин
из других контроллеров вы так возмете данные из реквеста и передадите умному сервису, который знает как и что инициализировать
Antonio
VO?
Dmitry
VO?
ValueObject
Эмин
врядли, скорее он запутался в логике своей
Anonymous
Antonio
ValueObject
ну вот метод getRate возвращает мне именно VO (если я правильно понял этот паттерн), некую модель, у которой нет никаких дополнительных методов кроме пары связей.
Эмин
да и связей там не должно быть
Эмин
просто объект с данными
Antonio
значит это не VO, если к нему настолько строгие требования
Эмин
вам надо подумать не о том где и как вызвать метод getRate, а скорее что и как должно происходить до вызова getRate
Эмин
вот думаю в месте ДО вызова у вас и есть проблемы
Dmitry
ну вот метод getRate возвращает мне именно VO (если я правильно понял этот паттерн), некую модель, у которой нет никаких дополнительных методов кроме пары связей.
если ты получаешь объект, и он на всем приложении у тебя одинаковый. можешь прямо его и забиндит в контейнере. и запрашивать его
Antonio
ээээ, этот метод вызывается сразу после проверки аутентификации. Поскольку даже на проверку авторизации уже влияют эти данные
Antonio
если ты получаешь объект, и он на всем приложении у тебя одинаковый. можешь прямо его и забиндит в контейнере. и запрашивать его
алилую. То с чего я и начинал. Биндить как примитив или как синглтон? Как это правильно потом использовать?
Dmitry
Тогда уж синглтон сервис который знает где и как получить эти данные
не тут нужен объект, а так получится сервис опять же :)
Эмин
ну ничего плохого нету в сервисе, который будет знать как достать объект
Эмин
может фабрику в конце концов
Эмин
а еще лучше если у вас прям всегда эти данные нужны, повесьте мидлварю
Эмин
на ее уровне проверяйте есть ли нужные данные в запросе, и тогда инициализируйте то что вы хотите
Эмин
далее уже когда до контроллера дойдете, у вас все будет готово
Antonio
как же ты его тогда хочешь забиндить, если он у тебя постоянно рассчитывается?
а вот это уже замечание в точку. При бинде, есть доступ к сессии или еще нет?
Эмин
да не надо вам биндить
Antonio
ну ничего плохого нету в сервисе, который будет знать как достать объект
такой сервис есть изначально. Желание именно получить объект напрямую
Эмин
делайте в сервисе, ленивой инициализации
Эмин
геттер который посмотрит - уже есть объект и вернет его, если нет то знает как и откуда достать
Эмин
да и бинд экземпляра объекта в контейнер... хз удачный ли это вариант
Dmitry
на данный момент так и есть
в общем надо смотреть на твою реализацию, но так как ты описал - биндинг плохая идея
Эмин
лара поддерживает фабрику для синглтона?
Эмин
я вот не в курсе, но тут прям ему фабрику надо)
Dmitry
лара поддерживает фабрику для синглтона?
а зачем именно синглтон? можно и обычный содать
Эмин
при чем с ленивой инициализацией
Dmitry
ну да, похоже на фабрику
Эмин
да если один и тот же объект у него везде дергается, почему бы его после фабрики не положить в синглтон
Эмин
и уже не проходить процесс инициализации больше
Dmitry
и уже не проходить процесс инициализации больше
потому что там будет не создания объекта, а инстанс лежать
Эмин
ну тут смотря что ему нужно
Antonio
ок. С этим я все понял. Другой вопрос
Andriy
Здраствуйте ребята, допустим у меня есть какой-то текст на странице, который я могу сохранять в БД. Но я хочу сделать его локализованным, чтобы можно было его сохранять для разных языков. Есть какие-то предложения?
Эмин
тут миллион предложений
Эмин
контент или статика в верстке?
Andriy
статика
Эмин
ну в верстке вы можете непосредственно транслитератор дергать
Antonio
Если у меня сейчас есть модель ClientLocal которая хранится в локальной базе, потом есть желание подключить вместо этой таблицы другую базу с моделью ClientBPM. Я хочу везде использовать просто CLient и соответственно биндить нужную реализацию. Тут я прав надеюсь? =) Так вот вопрос, надо ли создавать абстрактный класс Client или нет?
Эмин
а в базе использовать например какие то placeholder'ы
Эмин
зависит от реализации, либо интерфейс либо абстракт точно нужно
Antonio
ну тоесть пустой файлик точно нужно создавать?
Эмин
пустой файлик точно создавать не надо
Эмин
что вы имеете ввиду под пустым файликом?
Dmitry
ну тоесть пустой файлик точно нужно создавать?
бинди интерфейс, а к нему реализацию
Andriy
Antonio
Эмин
идите от интерфейса
Эмин
пишите сначало интерфейс, потом две его реализации
Antonio
бинди интерфейс, а к нему реализацию
там нет никаких методов, которые надо реализовывать отдельно
Dmitry
<?php namespace App\Models; class Client { }
это зачем? ты подумай что тебе от класса этого надо прям железно, и вынеси это в интерфейс
Dmitry
там нет никаких методов, которые надо реализовывать отдельно
ну а нафиг тебе тогда 2 одинаковых класса?
Dmitry
ну или просто пустой интерфейс
Dmitry
и ты будешь знать, что любой класс который реализует этот интерфейс можно использовать как ClientXXX
Antonio
ну а нафиг тебе тогда 2 одинаковых класса?
потому что одна модель как и вся база на MySQL. а затем будет заменено другой моделью, которая будет дрегаться с MSSQL. У них будут пересекаться некоторые свойства
Antonio
скажем так, мне надо знать, что у всех этих моделей есть поле [uid, name ...]. Как это можно прописать в интерфейсе?
Antonio
или тут тоже не нужен биндинг, а потом просто заменить один класс на другой?