Skip to content

Instantly share code, notes, and snippets.

@hirak
Created February 26, 2014 23:47
Show Gist options
  • Save hirak/9241254 to your computer and use it in GitHub Desktop.
Save hirak/9241254 to your computer and use it in GitHub Desktop.
Dependency Injectionを特定のDIコンテナに頼らず実現する ref: http://qiita.com/Hiraku/items/48fbdfca4b63c74494e9
<?php
$container = new \Pimple();
// オブジェクトコンストラクションのコンフィギュレーション
$container['infrastructure.mailer'] = function($container) {
$mailer = new \SendmailMailer();
return $mailer;
};
$container['domain.transfer.newsletter'] = function($container) {
$newsletterTransfer = new \NewsletterTransfer($container['infrastructure.mailer']);
return $newsletterTransfer;
};
return $container;
<?php
$container = new FactoryDefault;
// オブジェクトの利用
$newsletterTransfer = $container->createDomainTransferNewsletter();
$newsletterTransfer->send('ニュースレター本文');
<?php
class FactoryDefault
{
function createInfrastructureMailer()
{
return new SendmailMailer;
}
function createDomainTransferNewsletter()
{
return new NewsletterTransfer($this->createInfrastructureMailer());
}
}
<?php
class FactoryTest extends FactoryDefault
{
function createInfrastructureMailer()
{
return new SendmailMailerMock;
}
}
function createInfrastructureMailer()
{
static $mailer;
return $mailer ?: ($mailer = new SendmailMailer);
}
//...
function createInfrastructureMailer()
{
$mailer = parent::createInfrastructureMailer();
$mailer->setOption('hogehoge');
return $mailer;
}
//...
<?php
$container = new FactoryTest; //こっちに差し替える
//...
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment