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

Category:

Хотел ответить на комментарий к моему посту про DI, но в размер не уложился. Поэтому отвечу постингом.

Комментарий ezdakimak:

Вообще я не люблю Push метод передачи объектов. У меня преобладает Pull по типу

<?php
public function __construct(){
  
$this->db=CMS()->DB()->getDB();
}

Насчет push-pull. Для соединения с БД и подобного рода "звездных" объектов разумно устраивать такой Registry или Service Locator. В симфони подобный вашему CMS классу класс называется Context. Но часто нужны более "локальные объекты" и пихать их в контекст как-то странно и неуклюже.

Например у меня есть класс Report, который рендерит sql запрос ну и наследники, которые рендерят список объектов, обращаясь к модели. И вот такому классу было разумно пушить внутрь ReportFilter — объект, который устраивает разные виды отчетов — зебра, многоколоночный, вывод ячеек в порядке Z или в порядке N, таблица со "стертыми" границами и т.д.

<?php
$myReport
= new colesoDBReportLite(dirname(__FILE__).'/flat_column_template.tset.phtml');
 
$flatColumnFilter= new colesoFlatColumnOutputFilter();
$flatColumnFilter->outputType='Z'//вывод слева направо и сверху вниз
$flatColumnFilter->setColumns(5);
 
$myReport->setOutputFilter($flatColumnFilter);
$html2=$myReport->renderSQL($sql);
Но такой способо малость громоздкий. Теперь с помощью контейнера DI я смогу сильно сократить этот код. Просто запросив
<?php
$rc
=new ReportContainer(array(
  
'filter.type' => 'FlatColumn',
  
'filter.outputType' => 'Z',
  
'filter.columns'    => '5',
  
'report.template' => 'pathToTemplate'
));

$report=$rc->getRender($sql);

Таким образом я прячу зависимости report от filter в конфигиурацию контейнера. И получаю некоторую свободу.

Я пожалуй переведу страничку от доки к Phemto — DI контейнеру от Маркуса Бэйкера, который сделал SimpleTest. Там немножко под другим углом и библиотека совсем миниатюрная. Взгляни на нее, только не на ту доку, что на сайте, а на ту, что внутри дистрибутива.

Tags: development, di, php, symfony
Subscribe

  • (no subject)

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

  • Bing Interview

    Сходил на интервью в Microsoft. Получил известную долю удовольствия. 5 интервью одно за другим. 4 технических, одно -- HR. Интервьюверы умны,…

  • таки Bing!

    Я таки устроил в своей жизни еще одну авантюру -- послал резюме в Microsoft, когда узнал, что в августе они приедут собеседовать желающих поехать в…

  • 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.
  • 4 comments