[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Как копировать объекты? =)
Страницы: 1, 2, 3
kaww
Цитата (Arh @ 29.09.2015 - 08:37)
а потом гдето в коде ты используешь

да, в своем коде ты получаешь их из контейнера уже сконфигурированные объекты, по тем правилам, которые определил в сервисах, фабриках (говорим о pimple).
Цитата (Arh @ 29.09.2015 - 08:43)
и это всё ради того, что бы в конструкторе не делать new di

Не совсем так. Как уже говорил выше, pimple это скорее service locator а не полноценный dic. "Настоящий" diс должен сам определять какие зависимости внедрить при создании объекта (в pimple необходимо описывать в ручную), а чтобы это сделать придется пользовать рефлексию. Как это работает и почему это плохо (в плане производительности, хотя, конечно же, кэш спасет smile.gif ) можно посмотреть, например, в ZF2 http://framework.zend.com/manual/current/e...ckstart.di.html .
chee
Решается все просто. Должна быть реестр-фабрика или что-то очень похожее, которая отдает настроеные соединения по идентификатору. А вот эту уже фабрику можно внедрять.

Вот пример реализации:
1. Обращаемся к репозиторию соединений. Я использую в качестве рееста, репозиторий соединений, так как работа с БД у меня всего лишь модуль системы.
2. Инициализация соединений. Это как бы фабрика, но немного специфичная.
3. Настройка соединений

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

А и еще:

Cамое неприятное это объекты с конфигурированием через конструктор, к таким относится PDO и его наследники. Такие объекты приходится конфигурировать перед инициализацией, в силу чего они выпадают из DI механизма.

_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации
Arh
Oyeme
Цитата
У Вас должен быть stack обектов по "имени" чтобы Вы могли выдавать ссылки , если "имя" его совпало.

Это то о чем я писал в нале темы? (я писал что сделал stack обектов)
"Написал класс со всякой магией типа __call,__get,__set, что бы свойство создалось само, если его нет (в смысле если нет инъекции или точнее её подмены) "
А потом я еще начал разделать объекты по имени и хэшу переданных аргументов.
Но это не решает проблему что можно "испортить объект" и он автоматически испортится везде.
Хотя как kaww сказал, что если хочешь испортить, нужно наследовать или клонировать, что нужно такого правила придерживаться, правда pdo и другие такие не клонируешь.

_____________
Промокод предоставляет скидку на заказ домена и/или хостинга reg.ru
BFCC-3895-8804-9ED2
Arh
kaww
Цитата
да, в своем коде ты получаешь их из контейнера уже сконфигурированные объекты, по тем правилам, которые определил в сервисах, фабриках (говорим о pimple).

То есть я в своих классах в конструкторе делаю
$container = new Container();
вместо
$di = new di();.

Цитата
Как уже говорил выше, pimple это скорее service locator а не полноценный dic. "Настоящий" diс должен сам определять какие зависимости внедрить при создании объекта


то есть ты пишешь
class a {

function __construct (pdo $db){}

}


потом в другом месте
$container = new Container();
$a = $container['a'];


Класс контейнер с помощью рефлексии вытаскиевает "pdo" из конструктора и делает return new a(new pdo());
Грубо говоря так?

Но тогда почему
Цитата
объекты не должны ничего знать о dic

Если в классе нельзя делать $di = new di(); тогда как получить доступ к контейнеру внутри класса? Или я не понял о чем ты?

_____________
Промокод предоставляет скидку на заказ домена и/или хостинга reg.ru
BFCC-3895-8804-9ED2
Arh
chee
Цитата
Решается все просто. Должна быть реестр-фабрика или что-то очень похожее, которая отдает настроеные соединения по идентификатору. А вот эту уже фабрику можно внедрять.

Я о том и писал, что сделал фабрику которая возвращает объект если он уже там есть, или создаёт новый если нет. Но проблема в том, что объект можно испортить и он испортиться к хранилище фабрики, а соответственно везде.
Либо не использовать хранилище и всегда делать new, точнее что бы фабрика не использовала и делала. Но это накладно.
Блин опять пишу что уже писал выше =)

_____________
Промокод предоставляет скидку на заказ домена и/или хостинга reg.ru
BFCC-3895-8804-9ED2
kaww
Цитата (Arh @ 30.09.2015 - 07:20)
Класс контейнер с помощью рефлексии вытаскиевает "pdo" из конструктора и делает return new a(new pdo());
Грубо говоря так?

Что-то типа такого, но скорее не new a(new pdo()) а new a($container['pdo']), где pdo это сервис, который такж должен быть правильно инстанцирован и настроен.
Цитата (Arh @ 30.09.2015 - 07:20)
тогда как получить доступ к контейнеру внутри класса?

А зачем? все зависимости удовлетворяются из вне. Например, если ты скачаешь с гитхаба какую-нибудь библиотеку, то не будешь ведь ее переписывать так, чтобы она поддерживала твой "di".
Arh
kaww
Цитата
А зачем?

Как это зачем? Библиотека же может использовать другие библиотеки, иначе зачем тогда вообще di?
Допустим есть шаблонизатор, который компилирует шаблоны в чистый php и сохраняет скомпилированные файлы с помощью какого то другого класса, допустим класса кэш.
тоесть
$tpl = new tpl(new cache());

Или просто модели, которые используют тот же кэш или работу с базой данных.
$model = new model(new pdo());

Как в таком случае сработает тот же пимпл
$conteiner = new conteiner();
$conteiner['model']->getAll();

Тут запускается контейнер, который возвращает модель, которая использует шаблонизатор, который использует кэш.
Так вот как тут быть модели, если в ней нельзя использовать контейнер, как она запустит шаблонизатор?

К тому же описывать каждый аргумент геморойно, потом рефакторинг замучает.
function __construct (PDO $pdo, Smatry $smarty, Cache $cache) {}

ИМХО лучше передать объект, как я писал в начале темы. Или нет?
function __construct ($di) {}


Например, если ты скачаешь с гитхаба какую-нибудь библиотеку, то не будешь ведь ее переписывать так, чтобы она поддерживала твой "di".

А почему бы и нет?
Когда ты качаешь с гитхаба тот же смарти, приходится залезать в код и менять свойство отвечающее за дефолтную директорию (неуверен именно на счёт смарти, но суть такая).
Вот тоже самое с DIC, залезаешь в конструктор и меняешь дефолтный DIC

Скачал такую
function __construct ($di) {
$di = $di ? $di : new di();
}

Переписал на такую
function __construct ($di) {
$di = $di ? $di : new pimple();
}


ну ли без new в конструкторе, всегда в библиотеки передавать diс
$di = new di();// или new pimple
$model = new model($di);



_____________
Промокод предоставляет скидку на заказ домена и/или хостинга reg.ru
BFCC-3895-8804-9ED2
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.