Использование объекта внутри разных классов.

  • Автор темы Автор темы vsixer
  • Дата начала Дата начала

vsixer

Новичок
Добрый день.
Подскажите пожалуйста как мне реализовать следующую схему:
Пишу сайт, используя модель MVC. Соответственно имеется класс обработки ошибок Errors и множество контроллеров. Вопрос:
-Как мне добиться того, чтобы один и тот же объект класса errors был доступен из любого контроллера?
Может быть объявить его как глобальный?
 
Класс Errors не должен быть сингелтоном. Он должен явно инстанцироваться когда нужно и отрабатывать.

Что делает этот класс и для чего он нужен?
 
Что делает этот класс и для чего он нужен?
Да, в общем то, класс Errors я привел просто для примера. Меня интересуют способы реализации схемы, описанной в первом посте.
А не могли бы вы пояснить что значит явно инстанцироваться?
 
А не могли бы вы пояснить что значит явно инстанцироваться?
Значит - создаваться.

Первое, прочитай статью: http://wiki.agiledev.ru/doku.php?id=ooad:manage_dependencies_in_php_code

Второе. Я использую для "звёздных" объектов объект-переносчик под названием Context. По сути, это просто хранилище а-ля массив:

PHP:
// Создаем контекст - вот как раз он должен быть сингелтоном
$context = Base_Context::getInstance(); 
// Впрыскиваем в него основные объекты - Request, Response и Database 
$context->setRequest(Http_Request::getInstance())
        ->setResponse(Http_Response::getInstance())
        ->setDb(Db_Mysql_Base::create(
                    ini_get('mysql.default_host'),
                    ini_get('mysql.default_user'),
                    ini_get('mysql.default_password')
                )->setDatabase(DATABASE_NAME)
                 ->setCharset('cp1251')
               );

// далее context передается во Front-controller, а потом и в конкретный запрошенный контроллер
$application = new Base_Application($context);
	$application->enabledDebugInfo(ENABLED_DEBUG_INFO)
            ->getRoutesFromPhpFile('./configuration/routes.php')
            ->run();
Ну и код объекта-переносчика Context: http://pastebin.com/iMULcq1t
 
Ога, у тебя он Context называется.
Не совсем понятно, если он у тебя синглтон, зачем его впрыскивать?

P.S. за Куйгуыеб - отдельный респект. :)
 
Не совсем понятно, если он у тебя синглтон, зачем его впрыскивать?
Что бы у Base_Application и у контроллеров был интерфейс. Я раньше много чего через сингелтон юзал, ИМХо впрыскивание - очень элегантно и дает возможность дальнейшего расширения.
 
Что бы у Base_Application и у контроллеров был интерфейс. Я раньше много чего через сингелтон юзал, ИМХо впрыскивание - очень элегантно и дает возможность дальнейшего расширения.
Можно поподробнее? Не могу понять, как связаны между собой эти вещи.
 
Можно поподробнее? Не могу понять, как связаны между собой эти вещи.
Что поподробнее? Объяснить, почему Сингелтон - это плохо и не красиво и почему впрыскивание - лучше? Наверно потому, что один контекст можно подменить другим, например.
 
Ну а у тебя то все равно создается синглтон. Вопрос - зачем синглтон, если ты его впрыскиваешь?
 
Ну а у тебя то все равно создается синглтон. Вопрос - зачем синглтон, если ты его впрыскиваешь?
Затем, что вприскивание - это лучше, чем сингелтон. Вприскиваемый объект можно подменить, сингелтон придется заменять на другой сингелтон во всех классах.
 
Вот все вы никак не запомните. Синглтон и впрыскивание из разных опер. Синглтон - это порождающий паттерн. На способность быть куда то инжекнутым, нефункциональное свойство синглтон никак не влияет. Синглтон != обращение через статический метод (это стереотип). Синглтон = единственный экземпляр.
 
Сверху