ããã«ã¡ã¯ãå¼ã°ãã¦é£ã³åºã¦ã¸ã£ã¸ã£ã¸ã£ã¸ã£ã¼ã³ã@madapajaã§ãã
PHP5.4+ãã¬ã¼ã ã¯ã¼ã¯ BEAR.Sundayãç解ããããã«Ray.Diã触ã£ã¦ã¿ãã®å·»ã·ãªã¼ãº
ç¶ãã§ãã ååã¯ãRay.Di ã使ã£ã¦ä¾åæ§ã®æ³¨å ¥ãè¡ã£ã¦ã¿ã¾ããã ä»åã¯ãRay.Aop ã§ã¤ã³ã¿ã¼ã»ãã¿ã¼ã使ããã¢ã¹ãã¯ãæåããã°ã©ãã³ã°ã®ä½é¨ãä¸å¿ã«é²ãã¦ã¿ããã¨æãã¾ãã
ååã®è£è¶³
â¦ã¨ããã®åã«ååã®è£è¶³ãã
@PostConstruct
ã¢ããã¼ã·ã§ã³
ååã@PostConstruct
ã¢ããã¼ã·ã§ã³ã«ãã£ã¦åæåã¡ã½ããï¼__construct()
å¾ã«å®è¡ããã¡ã½ããï¼ã®å®ç¾©ãè¡ãã¾ããã
ããã¯ã³ã³ã¹ãã©ã¯ã¿ã§ããã®ã¨ãä½ãéãã®ã§ããããï¼ ä»åã®ãµã³ãã«ã®å ´åãã³ã³ã¹ãã©ã¯ã¿ä¸ã§å¼ã³åºãã¦ãæåã¯å¤ããã¾ããã
ãªãã³ã³ã¹ãã©ã¯ã¿ã§è¡ããªãã®ãããã®çç±ã3ã¤ã»ã©èãã¦ã¿ã¾ãããï¼@koriymãããããã¢ããã¤ã¹ããããã¾ããï¼
1ã¤ãã¯ãé¢å¿ãåé¢ãããããã§ãã
ã³ã³ã¹ãã©ã¯ã¿ã§ã¯æåéãæ§é ãæ§æããï¼ã¤ã¾ããããããã£ã¸ã®ä»£å
¥ï¼ã®ã¿ã«å¾¹ãã@PostConstruct
å
ã§ãã®æ§æããããªãã¸ã§ã¯ãã«å¯¾ãã¦ã®åæåå¦çãè¨è¿°ãããã¨ã§é¢å¿ãåé¢ããããã¾ãã
2ã¤ãã¯ã@PostConstruct
ã§ã¯å
¨ã¦ã®ä¾åã注å
¥ããã¦ããã®ãä¿è¨¼ããã¦ãã¾ãã
ååã®ãµã³ãã«ã§ã¯ã³ã³ã¹ãã©ã¯ã¿ã¸ã®ã¤ã³ã¸ã§ã¯ã·ã§ã³ãè¡ãã¾ããããRay.Di ã§ã¯Setterã使ã£ãã¤ã³ã¸ã§ã¯ã·ã§ã³ãå¯è½ã§ããã³ã³ã¹ãã©ã¯ã¿ã§ããSetterã§ã注å
¥ããã¨ããç¹ã§ã¯åãã§ãããæåãåºæ¬çã«å¤ããã¾ããããSetterã¤ã³ã¸ã§ã¯ã·ã§ã³ãè¡ããã¨ã§ãtraitãå©ç¨ãããããªãã¾ããï¼å®éã«ãBEAR.Sundayã§ã¯traitãå©ç¨ãã¦ããã³ãã¬ã¼ãã¨ã³ã¸ã³ã注å
¥ããããæ§ã
ãªç®æã§ä½¿ç¨ããã¦ãã¾ããï¼
Ray.Diã®å
é¨ã®æåã¯ãã³ã³ã¹ãã©ã¯ã¿ã¸ã®æ³¨å
¥å¾ã«ãSetterã¸ã®æ³¨å
¥ãè¡ãããæå¾ã« @PostConstract
ãå¼ã°ãã¾ãã
ãã¨ãã°ãè¤æ°ã®Setterã¤ã³ã¸ã§ã¯ã·ã§ã³ããããããªå ´åããããã®è¤åçãªè¨å®ãè¡ãã«ã¯ãå
¨ã¦ã®æ³¨å
¥ãä¿è¨¼ããã¦ãã @PostConstruct
å
ã§ããåæåã§ããªãå¦çãèããããã§ãããã
3ã¤ãã¯ãããã¯å¯æ¬¡çãªç¹å¾´ã§ãã @PostConstruct
ã§ã¯ãåæã«ã¤ã³ã¿ã¼ã»ãã¿ãå©ç¨ãããã¨ãå¯è½ã§ããï¼éã«è¨ãã°ãã³ã³ã¹ãã©ã¯ã¿å
ããå¥ã¡ã½ããå¼ã³åºãã¦ãã¤ã³ã¿ã¼ã»ããããã¾ãããï¼
Ray.Di ã§ãInjector::getInstance()
ãè¡ãã¨ããã®ã¯ã©ã¹ã®ä¾åã解決ããå¾ã«ãä¾åã注å
¥ããªãã¸ã§ã¯ããæ§æããããã®å¾ã«ã¦ã£ã¼ãã¼ï¼ã¤ã³ã¿ã¼ã»ãããç¹ãè¾¼ãï¼ãããæå¾ã« @PostConstruct
ãå¼ã³åºããã¾ãã
ãã®ããããã®ã¢ããã¼ã·ã§ã³å
ã§ã¯åæã«ã¤ã³ã¿ã¼ã»ãããå©ç¨ãããã¨ãã§ãããã¨ããããã§ãã
ã¢ã¸ã¥ã¼ã«ã®ä½ãæ¹ã«ã¤ãã¦
ã¢ã¸ã¥ã¼ã«ã®åå²åä½ã¯ï¼ï¼æ©è½ã®é¢å¿ãã¨ï¼ï¼åä½ã¢ã¼ãããªã©ã§åå²ãã¾ããsandboxã¢ããªã§ã¯DevModuleï¼åä½ã¢ã¼ãï¼ããã¬ã¼ã ã¯ã¼ã¯ã¢ã¸ã¥ã¼ã«ãæ©è½ã®ã¢ã¸ã¥ã¼ã«ãã¢ããªã±ã¼ã·ã§ã³ã¢ã¸ã¥ã¼ã«çãinstallãã¦ã¾ãã
â BEAR.Sundayãã (@BEARSunday) 7æ 12, 2012
æ©è½ã¯ãã¨ãã°Dbãªã Database\PdoModule ã«ããã®ã Database\DoctrineOrm ã«ããã®ãã¨ãã£ãå
·åã§ãããã®ã¢ã¸ã¥ã¼ã«å
ã§ã¯å¿
è¦ãªDIãAOPè¨å®ãè¡ãã¾ãã
â BEAR.Sundayãã (@BEARSunday) 7æ 12, 2012
ã¨ããããã«ãã¢ã¸ã¥ã¼ã«ã¯é¢å¿ãã¨ã«åé¢ãã¹ãã§ããï¼ä»åã¯ãµã³ãã«ãªã®ã§â¦ï¼
Ray.Diã«ã¯ãããã¢ã¸ã¥ã¼ã«ã®ä¸ããä»ã®ã¢ã¸ã¥ã¼ã«ãã¤ã³ã¹ãã¼ã«ï¼è¿½å è¨å®ã®ãããªæãï¼ããæ©è½ãããã¾ãã
æ©è½ã»é¢å¿ãã¨ã«ã¢ã¸ã¥ã¼ã«ãåé¢ããããã¨ã§ããã¨ãã°ãå®è¡ï¼æ¬çªããã¹ããéçºï¼ã¢ã¼ããè¦æ±ããæ©è½ãé¢å¿ããå¿
è¦ã«å¿ãã¦æ§æããããã¨ãã§ããããã«ãªãã¾ãã
ããã¯ãä¸ã®ã¤ã¶ããã«ãããããã«ãBEAR.Sundayã®å¤§ããªç¹å¾´ã®ä¸ã¤ã§ãã
ãããä»ã®FWã®ã¤ãã³ãã«ããæ©è½æ¡å¼µã¨éãã¨ããã§ãFWå
ã®ã³ã¼ãã§ã¤ãã³ãï¼ã·ã°ãã«ï¼ãçºè¡ãã¦Appå´ã§ã³ã¼ã«ããã¯ãã¢ã¿ããããã®ã§ã¯ãªãã¦ããµã¼ãã¹ã³ã³ãã¼ãã³ããã®ãã®ãDIã§å
¥ãæ¿ãããã®æ¯ãèããAOPã§å¤æ´ãã¾ã
â BEAR.Sundayãã (@BEARSunday) 7æ 12, 2012
ãã¹ã¦ã®ã¡ã½ããã«ã¤ã³ã¿ã¼ã»ãã¿ããã¤ã³ããã¦ã¿ã
ã§ã¯ãããããæ¬ç·¨ã§ãã
å¦çæéãè¨ãã¿ã¤ãã¼ã¤ã³ã¿ã¼ã»ãã¿ãä½ããããããã¹ã¦ã®ã¡ã½ããã¸åçç¡ç¨ã§è¿½å ï¼ãã¤ã³ãï¼ãã¦ã¿ããã¨æãã¾ãã ã¡ã½ããã¸é©ç¨ããã¤ã³ã¿ã¼ã»ãã¿ã¯ Ray\Aop\MethodInterceptor
ãç¶æ¿ãã¦ä½ãã¾ãã
ã¡ã½ãããå¼ã³åºãããã¨ãinvoke()
ãå¼ã³åºãããã®ã§ãã®ä¸ã§åå¾ã«æã¿è¾¼ã¿ããå¦çãè¨è¿°ãã¾ãã
ä»åã¯ä»¥ä¸ã®ããã«ä½ãã¾ããã
src/Madapaja/Ray/Di/Sample01/Interceptor/Timer.php
namespace Madapaja\Ray\Di\Sample01\Interceptor;
use Ray\Aop\MethodInterceptor;
use Ray\Aop\MethodInvocation;
class Timer implements MethodInterceptor
{
public function invoke(MethodInvocation $invocation)
{
printf('%s::%s(): Timer start'."\n", $invocation->getMethod()->class, $invocation->getMethod()->name);
$mtime = microtime(true);
$return = $invocation->proceed();
$time = microtime(true) - $mtime;
printf('%s::%s(): Timer stop [%01.7f sec]'."\n\n", $invocation->getMethod()->class, $invocation->getMethod()->name, $time);
return $return;
}
}
å¦çã¨ãã¦ã¯ãã¡ã½ããéå§åå¾ã«ã¡ã½ããåã¨ã¿ã¤ãã¼ç¶æ³ã®ã¢ã¦ããããã¨ãè¨æ¸¬å¦çãè¡ã£ã¦ããã ãã§ããã
invoke
ã¡ã½ããã¯å¼ã³åºãããéã«å¼æ°ã¨ãã¦ã¡ã½ããå®è¡ã«å¿
è¦ãªç¥èãæã£ããªãã¸ã§ã¯ãï¼MethodInvocationï¼ã渡ããã¾ãã
ãã®ç¥èãå©ç¨ãã¦ã¡ã½ããåãªã©ã表示ãããã¾ãã14è¡ç®ã§ $invocation->proceed()
ãããã¨ã§ãªãªã¸ãã«ã®ã¡ã½ãããå®è¡ãã¾ãã
ãããã¤ã³ã¿ã¼ã»ãã¿ãåºæ¥ãã®ã§ããããã¤ã³ããã¾ãã
åå説æããã¨ãããã¢ããªã±ã¼ã·ã§ã³ããã¬ã¼ã ã¯ã¼ã¯ãæ§æããéã«ä½¿ãããç¥èã¯ã¢ã¸ã¥ã¼ã«ãæã¡ã¾ããUserModule
ã«ã¤ã³ã¿ã¼ã»ãã¿ããã¤ã³ãããå¦çã追å ãã¾ãã
src/Madapaja/Ray/Di/Sample01/Module/UserModule.php
namespace Madapaja\Ray\Di\Sample01\Module;
use Ray\Di\AbstractModule;
use Madapaja\Ray\Di\Sample01\Interceptor\Timer;
class UserModule extends AbstractModule
{
protected function configure()
{
// bind dependency @Inject @Named("pdo_user")
$pdo = new \PDO('sqlite::memory:', null, null);
$this->bind('PDO')->annotatedWith('pdo_user')->toInstance($pdo);
// bind aspect Timer
$this->bindInterceptor(
$this->matcher->any(),
$this->matcher->any(),
[new Timer]
);
}
}
17è¡ç®ãã bindInterceptor
ã¡ã½ããã§ã¤ã³ã¿ã¼ã»ãã¿ããã¤ã³ããã¦ãã¾ãã ãã®ã¡ã½ãã㯠3 ã¤ã®å¼æ°ãåãã1ã¤ç®ã¯ã¯ã©ã¹ã®ãããã£ã¼ãã2ã¤ãã¯ã¡ã½ããã®ãããã£ã¼ãã3ã¤ãã¯ã¤ã³ã¿ã¼ã»ãã¿ã¼ã®é
åã渡ãã¾ãã
1ã¤ãã¨ã2ã¤ãã®å¼æ°ã« $this->matcher->any()
ã渡ããã¨ã§ããã¹ã¦ã®ã¡ã½ããã«é©ç¨ãããããã«ãªãã¾ãã
ãã®ç¶æ
ã§ãphp main.php
ã¨ãã¦å®è¡ãã¦ã¿ãã¨ãã¿ã¤ãã¼ã¤ã³ã¿ã¼ã»ãã¿ããã¤ã³ãããã¦ãããã¨ãåãããã¨æãã¾ãã
Madapaja\Ray\Di\Sample01\Model\User::init(): Timer start
Madapaja\Ray\Di\Sample01\Model\User::init(): Timer stop [0.0005341 sec]
Madapaja\Ray\Di\Sample01\Model\User::createUser(): Timer start
Madapaja\Ray\Di\Sample01\Model\User::createUser(): Timer stop [0.0001001 sec]
Madapaja\Ray\Di\Sample01\Model\User::createUser(): Timer start
:
:
ã¢ããã¼ã·ã§ã³ã使ã£ã¦ç¹å®ã®ã¡ã½ããã«ã¤ã³ã¿ã¼ã»ãã¿ããã¤ã³ããã¦ã¿ã
次ã«ããã©ã³ã¶ã¯ã·ã§ã³ãè¡ãã¤ã³ã¿ã¼ã»ãã¿ãä½ã£ã¦ç¹å®ã®ã¡ã½ããã¸ã®ãã¤ã³ãããã¦ã¿ã¾ãã ç¹å®ã®ã¡ã½ããã¸ã®ãã¤ã³ãã¯ãã¡ã½ããåã®ãã¬ãã£ãã¯ã¹ãã¢ããã¼ã·ã§ã³ã§ãããããããã¨ãã§ãã¾ãããä»åã¯æ±ç¨çã«ä½¿ããããã«ã¢ããã¼ã·ã§ã³ã§ããããããããã«ãã¾ãã
ã¾ãã¯ã¿ã¤ãã¼ã®æã¨åãããã«ããã©ã³ã¶ã¯ã·ã§ã³ã¤ã³ã¿ã¼ã»ãã¿ãä½ãã¾ãã
src/Madapaja/Ray/Di/Sample01/Interceptor/Transaction.php
namespace Madapaja\Ray\Di\Sample01\Interceptor;
use Ray\Aop\MethodInterceptor;
use Ray\Aop\MethodInvocation;
/**
* Transaction interceptor
*/
class Transaction implements MethodInterceptor
{
public function invoke(MethodInvocation $invocation)
{
$object = $invocation->getThis();
$ref = new \ReflectionProperty($object, 'db');
$ref->setAccessible(true);
$db = $ref->getValue($object);
$db->beginTransaction();
try {
echo "begin Transaction" . json_encode($invocation->getArguments()) . "\n";
$invocation->proceed();
$db->commit();
echo "commit\n";
} catch (\Exception $e) {
$db->roleback();
}
}
}
15è¡ç®ã§ $invocation->getThis()
ããå®è¡ããããªãã¸ã§ã¯ãï¼User ãªãã¸ã§ã¯ãï¼ãåå¾ãã¦ãã¾ãã ãã©ã³ã¶ã¯ã·ã§ã³ãè¡ãããã« User::$db
ã¸ã®ã¢ã¯ã»ã¹ãè¡ãããã®ã§ããããã®ããããã£ã¯ãã©ã¤ãã¼ãããããã£ã®ããããã®ã¾ã¾ã¢ã¯ã»ã¹ãããã¨ãã§ãã¾ããã
ãã㧠16è¡ç®ã§ãªãã¬ã¯ã·ã§ã³ããããã£ãåå¾ããããããã£ãã¢ã¯ã»ã¹å¯è½ã«ããä¸ã§ãã©ã³ã¶ã¯ã·ã§ã³å¦çãè¡ã£ã¦ãã¾ãã
次ã«ããã®ã¤ã³ã¿ã¼ã»ãã¿ãé©ç¨ãããã¢ããã¼ã·ã§ã³ãä½ãã¾ãã
ä»å㯠@Transactional
ã¢ããã¼ã·ã§ã³ã¨ããååã§ä»¥ä¸ã®ããã«ä½ãã¾ããã
src/Madapaja/Ray/Di/Sample01/Annotation/Transactional.php
namespace Madapaja\Ray\Di\Sample01\Annotation;
use Ray\Di\Di\Annotation;
/**
* @Annotation
* @Target("METHOD")
*/
final class Transactional implements Annotation
{
}
ä½ã£ãã¢ããã¼ã·ã§ã³ã User
ã¯ã©ã¹ã«é©ç¨ããã¾ãããã
src/Madapaja/Ray/Di/Sample01/Model/User.php
namespace Madapaja\Ray\Di\Sample01\Model;
use Ray\Di\Di\Inject;
use Ray\Di\Di\Named;
use Ray\Di\Di\PostConstruct;
use Madapaja\Ray\Di\Sample01\Annotation\Transactional;
class User
{
// ...
/**
* @Transactional
*/
public function createUser($name, $age)
{
$sth = $this->db->prepare('INSERT INTO User (Name, Age) VALUES (:name, :age)');
return $sth->execute(array(':name' => $name, ':age' => $age));
}
// ...
use ãã¦ã¢ããã¼ã·ã§ã³ããã ãã§ãã
æå¾ã« UserModule
ã§ãã¤ã³ããã¾ãã
src/Madapaja/Ray/Di/Sample01/Module/UserModule.php
namespace Madapaja\Ray\Di\Sample01\Module;
use Madapaja\Ray\Di\Sample01\Interceptor\Timer;
use Madapaja\Ray\Di\Sample01\Interceptor\Transaction;
use Ray\Di\AbstractModule;
class UserModule extends AbstractModule
{
protected function configure()
{
// ...
// bind aspect @Transactional method
$this->bindInterceptor(
$this->matcher->any(),
$this->matcher->annotatedWith('Madapaja\Ray\Di\Sample01\Annotation\Transactional'),
[new Transaction]
);
}
}
18è¡ç®ã§ãã¡ã½ããã« @Transactional
ã¢ããã¼ã·ã§ã³ãæå®ããã¦ããå ´åã«ãããããããã«ãannotatedWith()
ãããã£ã¼ã使ã£ã¦ãã¤ã³ããã¾ãã
ããã§ãã©ã³ã¶ã¯ã·ã§ã³ã¤ã³ã¿ã¼ã»ãã¿ããã¤ã³ãã§ãã¾ããã®ã§ãphp main.php
ã¨ãã¦å®è¡ãã¦ã¿ã¾ãããã
Madapaja\Ray\Di\Sample01\Model\User::init(): Timer start
Madapaja\Ray\Di\Sample01\Model\User::init(): Timer stop [0.0005541 sec]
Madapaja\Ray\Di\Sample01\Model\User::createUser(): Timer start
begin Transaction["Koriym",30]
commit
Madapaja\Ray\Di\Sample01\Model\User::createUser(): Timer stop [0.0001891 sec]
Madapaja\Ray\Di\Sample01\Model\User::createUser(): Timer start
begin Transaction["Bear",22]
commit
Madapaja\Ray\Di\Sample01\Model\User::createUser(): Timer stop [0.0001378 sec]
Madapaja\Ray\Di\Sample01\Model\User::createUser(): Timer start
begin Transaction["Yoshi",25]
commit
Madapaja\Ray\Di\Sample01\Model\User::createUser(): Timer stop [0.0001421 sec]
Madapaja\Ray\Di\Sample01\Model\User::readUsers(): Timer start
Madapaja\Ray\Di\Sample01\Model\User::readUsers(): Timer stop [0.0000980 sec]
:
:
ãã®ããã« @Transactional
ã¢ããã¼ã·ã§ã³ããã User::createUser()
ã¡ã½ããã®ã¿ã«ãã©ã³ã¶ã¯ã·ã§ã³ãè¡ããã¦ããã®ãåãããã¨æãã¾ãã
ã¨ããããããµã³ãã«ãéã㦠Ray ã®è§¦ãããç´¹ä»ã§ããã¨æãã¾ãã
ã¤ã³ã¿ã¼ã»ãã¿ã¼é¢ç½ãã§ãã
åèãªã³ã¯
PHP5.4+ãã¬ã¼ã ã¯ã¼ã¯ BEAR.Sundayãç解ããããã«Ray.Diã触ã£ã¦ã¿ãã®å·»ã·ãªã¼ãº