Boroda aka Hamster (fantaseour) wrote,
Boroda aka Hamster
fantaseour

Categories:

Зло Синглтона и Peer из ActiveRecord

Настал момент, когда чуствуешь, что СинглТон это зло. Ну правда, если  у тебя есть родительский процесс, например запускатель тестов и ты в нем запускаешь тесты классов, основанных на общей библиотеке с синглтонами. Сами-то классы ходят например к разным БД, используют разные языковые настройки и у них конфиги разные. Ну и все -- приехали. В одном скрипте не запустишь и то и другое.

Выход, понятное дело в фабриках, а еще лучше в DI (IoC).

Однако при таком подходе теряется простота и изящность классов Peer из active record.

Ну вот удобно же написать в любом месте:

$car=carPeer::find(5);

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

Но такая архитектура очень негибкая. Мы сразу прилипаеам к этому синглтону. И нам очень трудно будет добавлять чужие классы и отпускать свои классы в общественное пользование.

Как выход, видится свойство $context, передаваемое по цепочке вызываемых контроллеров. Это свойство -- IoC контейнер, и тогда в любом контроллере можно будет делать так:

$car=$context->create('carPeer')->find(5);

Не так изящно, но жить можно. Контейнер нужно создавать в точке входа и потом его передавать дальше. В случае Phemto контейнер создается на базе простого конфига:

$injector=require('injector_config.php');
$car=$injector->create('carPeer')->find(5);

В injector_config будет что-то вроде такого:

<?php
require_once('phemto/phemto.php');

$injector = new Phemto();
$injector->willUse(new Reused('dbConn'))->fill('dbConfig') ->with(array(...my config here ...)) ;
return $injector;
?>


при этом условный класс коннекшена будет иметь такой конструктор:


class dbConn
{
function __construct($dbConfig)()
{
....
}
}


Также объект Peer можно создать и без инжектора:

$peer=new carPeer($dbConn);

Просто инжектор позволяет создать инфраструктуру для создания классов на основе локальной конфигурации.


Tags: development, php
Subscribe

  • Так. Чуть не бросил дневник :)

    Ну вот, хотел не бросать и опять сюда не пишу :( Потому, что в будние дни сил нет писать, а в выходные вот то у меня ДР, то у пасынка. То просто…

  • 46

    Дня рожденья пост. Ну ничего, мы еще позажигаем :)

  • (no subject)

    Я очень люблю конференции. Они зажигают в разработчике свечечку, которую он потом бережно несет в себе через весь год! Когда-то давно, я с завистью…

  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 3 comments