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)

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

  • wordpress: php -> nodejs

    Хипстеры захватывают мир :) Не очень понятно, как этот переход отразится, на людях, которые ставят этот вордпресс на любой копеечный хостинг с…

  • ultimate php

    For those who asked how to get started testing PHP7. I have packaged up my dev environment in a Vagrant box: https://t.co/EOhyi17fPI— Rasmus…

  • 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