Symfonyã®æ´å²ãæ¯ãè¿ã£ã¦ã¿ã
ããã«ã¡ã¯ãSymfony Advent Calender 2019 ã® 7æ¥ç®ã§ãã
(ãã§ã«8æ¥ç®ã«ãªã£ã¦ãã¾ãã¾ãããæ°ã«ããæ¸ãã¦ããã¾ãã)
Â
æ¨æ¥ã¯Â ãåå¿è åãããã使ãSymfonyã³ãã³ãéã§ãããèªåããã使ãã³ãã³ã㯠debug:router ããªãã³ãã³ãå¤ãã¦ä¾¿å©ãªã¨ãã㯠Symfony ã®ç¹å¾´ã§ãããã
Â
èªåãSymfonyã¨é¢ããã¯ããã¦ããç´12å¹´ããããã¡ã¾ããã
ä»æ¥ã¯ Symfony ã®æãããæãåºè©±ããã¦ã¿ããã¨æãã¾ãã
Â
Symfony 㯠symfony ã ã£ã
ã2007å¹´1æãsymfony1ããªãªã¼ã¹ããã¾ããã
ã2ç³»ããã¯å¤§æåã«ãªãã¾ãããã1ç³»ã®ããã¯symfonyã¨å°æåã§ãããããããªsymfonyãåãã¦ãã£ãçç±ã¯ãã®å½æã®æå±ãã¦ããä¼ç¤¾ã§ä½¿ã£ã¦ããå ±éã®ãã¬ã¼ã ã¯ã¼ã¯ã¯Mojavi ã ã£ãã®ã§ããããã£ã¨ä½¿ããããã®ãæ¢ãã¦ããã¨ãã§ãããã¾ã 0.8ãããã®ãã¼ã¸ã§ã³ã ã£ãã¨æãã¾ãã
ãçµæã¨ãã¦PHP5ãå¿ é ã ã£ãsymfonyã¯å¤ãã®ç¨®é¡ã®ã¯ã©ã¤ã¢ã³ããæ±ãã¦ããè·å ´ã«ã¯å³ããCakePHPã«æ±ºããã®ã§ãããsymfonyã®ããã¥ã¡ã³ãã®å¤ããå å®æ§ã«æ¹ããã¦ãããã¯ã¿ããªã«ç¥ã£ã¦ã»ãããã¨åæã«ããã¥ã¡ã³ãã翻訳ãå ¬éãã¦ã¾ããã
ããã®å½æã¯ãããã¢çµãã¨ããååã®wikiã«æ¸ãã¦ã¾ããããã
ã(ããã£ã¦ã¿ãã¨èªåãæ¸ãã¦ãããã®ã¨åãã£ã½ããã©ã¼ãµã¤ããåºã¦ãã¾ãããèªåãæ¸ãããã®ãã©ããããããªãã®ã§ãªã³ã¯è²¼ãã®ã¯æ§ãã¦ããã¾ã)
 ããã°ãè¦ã¤ãããããã¨symfonyã®tracã«æãã¦ãããã¦ã¾ãããããã(ãªã®ã§12å¹´ã®ç¹ãããªã®ã§ãã)
ãæµ·å¤ã®OSSã¨ãããã¨ããããJISã§ã¡ã¼ã«ããã®ã大å¤ã ã£ããããã®ã§ãã©ã°ã¤ã³ãæ¸ãããããã¦ã¾ããã
ããããã¦ããã¨ãå¨ããã㯠symfony ã®äººã¨ãã¦ç¥ãããããã«ãªã£ã¦ããã¾ãããããã¦åºç社ãããsymfonyã®æ¬ãæ¸ãã¦ã¿ãªããï¼ãã¨ææ¡ãé ãæ¬ãæ¸ãã¦ã¿ããã¨ã«ãã¾ããããããæ¸ãçµãããããã®ç´åã«1.0ããªãªã¼ã¹ããã¦ããã¹ã¦ã®ãã£ããã£ãåä½ç¢ºèªãããç´ããè¨æ¶ãããã¾ããããã¢ã·ã¢ã«ããããæ¬ãåºãã®ã¨å¤§ä½åãã ã£ãè¨æ¶ã§ãã
Â
ã
ããã®å½æã¯å½å ã§ã¯ CakePHP, symfony, Ethna, Maple, Mojavi, ZendFramework ããããã¡ã¸ã£ã¼ã©ããã ã£ãæ°ããã¾ãã
Â
ãã¡ãªã¿ã«symfonyã¯PHP5ç¨Mojaviã§ããMojavi3ã®forkã¨ãã¦ã¹ã¿ã¼ããããã¨ãç¥ã£ã¦ã人ã¯å°ãªãã§ãããã
Â
第ä¸åsymfonyåå¼·ä¼éå¬
2008å¹´ã«ãã£ã¦ã¾ãããæããã...
ãã¡ãã¢ã³æ¥æ¥
ããããª2009å¹´ã®PHPã«ã³ãã¡ã¬ã³ã¹ã§éçºè ã§ãããã¡ãã¢ã³ãæ¥æ¥ãããã¨ã«ãªãããã®å½æã«symfonyã使ã£ã¦ãã人ãã¡ãéã¾ã£ã¦ãã¡ãã¢ã³ã¨æ±äº¬è¦³å ãã¾ãã
Â
ãå°ä¸éã§é»è»å¾ ã£ã¦ãã¨ãã«ãã¡ãã¢ã³ã«ããªãã§PHPã§ãã¬ã¼ã ã¯ã¼ã¯æ¸ããã®ï¼ãã£ã¦èããããæ¬å½ã¯Pythonã好ããªãã ãã©ããã¨ãå½æ5.3ããªãªã¼ã¹ããããããã®ææã§ãåå空éã®ã»ãã¬ã¼ã¿ãããã¯ã¹ã©ãã·ã¥ãªã®å«ã ãã¨ãè¨ã£ã¦ãè¨æ¶ã
ããã®äººã®å¤ã®ãã¯ããä¸è¯æçå±ã§é£ã¹ã¦ããã¨ãã«ãã¨ã¤ãããã¡ãã¢ã³ãå½æéçºãã¦ã Syfmony2 ã®ã³ã³ã»ããããã¬ã¼ã³ãã¦ããã¦ããDIã ãã¨ç±ãèªã£ã¦ããã®ãæãåºãã¾ãã
Â
æ¥æ¬ Symfony ã¦ã¼ã¶ã¼ä¼ã®è¨ç«
ããã¦ããã®ã¨ãã«ãã¡ãã¢ã³ããããããä»å¹´ã®å¹´æ«ã®ã¢ããã³ãã«ã¬ã³ãã¼ã®å 容ãããããªè¨èªã§åæã«åºããããæ¥æ¬èªããã£ã¦ã¿ãªãããã¨å£°ããããããæ±äº¬è¦³å ãã¦ããã¡ã³ãã¼ã§ãã£ã¦ã¿ããï¼ã¨ãããã¨ã§éã¾ã£ãã®ãã¦ã¼ã¶ã¼ä¼ã®æåã§ããã
Â
ãããã2009å¹´ã«çºè¡¨ããã ãMore with Symfonyãã§ãã
ããã¡ãã¢ã³èªèº«ãæ¸ãã¦ã¾ãããPHPã«ã³ãã¡ã¬ã³ã¹ã«æ¥æ¥ãããã¨ããã£ãããªã®ã§ã»ãã¨åã話ã§ãããã
I started to talk about the idea during the PHP conference in Japan, and in a matter of hours the Japanese translation team was ready to work. That was amazing! The response from the authors and translators was equally encouraging and, in a short time, "More with symfony" was born.
ãMLã§ããã¨ãããªãããæ¬å®¶ã®è¨äºããªããªãä¸ãã£ã¦ããªãã¦ç¿»è¨³éã«åããªãããããªããã¨ããæ¬å®¶ã®è¨äºã®æ¹ã«ééããããã®ãææããã... ã¨å¤§å¤ã ã£ããªãã¨ã
Â
symfony1.2㧠Propel ãã Doctrineã«
ãå½åã®symfonyã®ORMã¯Propelã§ãããããã使ããããã¨ããç¹ã§ Doctrineãå©ç¨ãã人ãå¢ãã¦ãããã¨ããããsymfonyã®æ¨æºORMãDoctrineã«å¤ããã¾ããããã®ããã¯ãã©ã¡ãã®ORMã使ããæå®ã§ããè¨æ¶ãã¡ãªã¿ã«ä»ããPropelã¯ãã®å½æã®Propelã¨ã¯å¥ç©ãããã«é²åãã¦ãã¾ã£ã¦ãã¾ãã
symfony1.4 ã§ä¸åºåã
ã¦ã¼ã¶ã¼ä¼ã§ã¯ããã¥ã¡ã³ãã®ç¿»è¨³ãããåå¼·ä¼ãããããã¦ãã¾ãããã1ç³»ã®æå¾ã®ãã¼ã¸ã§ã³ã¯é·ã使ããããã¨ãèããããã®ã§ãã¦ã¼ã¶ã¼ä¼ã®ã¡ã³ãã¼ã§èªåãã¡ãä¸çªæ¬²ããæ¬ãæ¸ããï¼ã¨ãããã¨ã§2011å¹´3æã«åºçãã¾ããã
Â
https://www.amazon.co.jp/dp/4798029343
Â
Symfony2 ã¯ã¨ã³ã·ã¹ãã å¿å
 2011å¹´7æã«ã¤ãã«Symfony2ããªãªã¼ã¹ããã¾ãã
 Symfony2 㯠symfonyã¨ä½ãéãã®ãï¼ã§ããã¨æ¬å½ã«éããã¬ã¼ã ã¯ã¼ã¯ã«ãªã£ã¦ãã¾ããããã³ãã«ã«ãããã¬ã¼ã ã¯ã¼ã¯ãã®ãã®ããã³ãã«ã®1é¨ã§ããã¨ããèãæ¹ããªã¯ã¨ã¹ããåãã¬ã¹ãã³ã¹ãè¿ããã¨ããç¹ã«æ³¨åã ããããã¬ã¼ã ã¯ã¼ã¯ã§ãããã¨ãDIã®å°å ¥ã
Â
symfonyã§ãã¡ã ã£ãã¨ãããå®å ¨ã«ã¼ãããè¨è¨ããªããã¨ããã¯ãã¡ãã¢ã³ããããªãã¨æãã¾ããããã®ä¸æ¹ã§æ¢åã®ã¢ããªã±ã¼ã·ã§ã³ã®ãã¬ã¼ã ã¯ã¼ã¯ã®ãã¼ã¸ã§ã³ã¢ãããã»ã¼æ¸ãæãã«ãªã£ã¦ãã¾ãã¨ããç¹ã¯ä»æ¹ããè¾ãã¨ãã声ãä¸ãã£ã¦ã¾ãããããã§ãéå»ãå¼ãã¥ããã«æ¸ãç´ãããã¨ãä»ã«ã¤ãªãã£ã¦ãããã ã¨æãã¾ãã
Â
Silex
 Symfony2ã§ã¯ã³ã³ãã¼ãã³ãã«ããçµã¿åããã ã¨ããç¹ãå©ç¨ãã¦ããã¤ã¯ããã¬ã¼ã ã¯ã¼ã¯ã§ããSilexãä½ãããã®ããã®ããã§ããã決ãã¦è»½éã§ã¯ãªããã©ã·ã³ãã«ã«æ¸ããè¨è¨ã«æåããããã¯ã¿ããªã«ç¥ã£ã¦ã»ããã¨ã¾ãããã¥ã¡ã³ãã翻訳ãããWEB DB PRESSã«æ¸ããããã¦ããã®ãæãåºãã¾ã
Â
Symfony2ç³»ãã3ç³»ã«
1ç³»ã®é ã«æ¯ã¹ãã¨ç·©ããã«ã§ã確å®ã«é²åãã¦ããã¾ããããã¼ã¸ã§ã³ã¢ãããå¤å°ã®è¾ãã¯ãã£ã¦ã絶対ç¡çã¨ã¾ã§ã¯ãããªãã¬ãã«ã§é²åãã¦ããã¾ãã
Â
ã¨ãã«ã³ã³ãã¼ãã³ããããæ´ç·´ããã¦æ©è½ãå¢ããã使ãããããªã£ã¦ããã¾ããããã¦ççµåããã¦ã²ãããå½ããåã®ãã¨ãyamlã«æ¸ããªãã¦ã¯ãªããªãã£ãDIãautowiringã®ç»å ´ã§é©å½çã«æ¥½ã«ãªã£ãããParamConverterã§ä¾¿å©ã«ãªã£ããã¨...
Â
ããã¦Laravelã®äººæ°ãå½å ã§åºãã£ã¦ãã£ãã®ãããæ°å¹´ã®ãã¨ã§ããããSymfonyã®ã³ã³ãã¼ãã³ããå©ç¨ããå¥ã®è¡¨ç¾ã®ãã¬ã¼ã ã¯ã¼ã¯ã¨ããæå³ã§ã¯Silexã¨å å¼ããããã¾ãããã
Â
Symfony Flex
Symfony4ã§ã¯ããã«Symfony Flexãç¨æããã¾ãããããããã¤ã³ã¹ãã¼ã©ã¼ã®æ©è½ã§ãã使ãããæ©è½ã追å ããããsatandardã¨ãã£ã·ã§ã³ãå©ç¨ãããã¿ãããªãã¨ãç°¡åã«ã§ããããã«ãªãã¾ããã
Â
ãã¬ã¼ã ã¯ã¼ã¯ãã®ãã®ã¨ããããã¯ç°å¢é¢ã®ãµãã¼ããå å®ãã¦ããã¤ã¡ã¼ã¸ã§ããã
Â
Symfony5
大ããå¤ãã£ãã¨ããã¨ããã¯ã¾ã ãããã¾ãããããã¡ãã¢ã³ã®ãã¨ãªã®ã§ãã£ã¨è²ã èãã¦ããã§ããããSymfony5ã®æ¬ã¯ãã¥ã¼ããªã¢ã«ãããªãã¦å®è·µçãªå 容ã«ãªãã¨è¨ã£ã¦ããã®ã§ä»å¾ããã£ããã¨è¿½ã£ã¦ããããã¨æãã¾ãã
Â
The #Symfony 5 book is about creating a "real" project. Not a "Hello-World"-style project. Not just PHP and a database.
â Fabien Potencier (@fabpot) 2019å¹´11æ13æ¥
The final infrastructure is full of services. Here is the diagram:https://t.co/IOjUDiLCup pic.twitter.com/KJbdsNhTRf
Â
次ã®è¨äºããã²èªãã§ãï¼
Â
Â
Â
ã
Â
Â
管çç»é¢ã«æ±ç¨çã§ä¾¿å©ãããæ©è½è¿½å ã¯ãããããã¨å±éºãããããªã
ã以åãPHPã«ã³ãã¡ã¬ã³ã¹ã§éç¨ããããæ°ã¥ãã管çç»é¢ã¨ããçºè¡¨*1ãã¾ããããä»ããã®èãæ¹ã大äºã«ããªããæ¥ã ãµã¼ãã¹ã®éç¨ãéçºããã¦ãã¾ããã
ããã®ä¸ã§ãæè¿æã£ããã¨ããã£ãã®ã社å kibelaã«ãã¨ã ã£ã¦ãã£ãã®ã§ãããæ®éã«å ¬éã§ããå 容ã ã£ãã®ã§ããã«ã¡ãã£ã¨å çãã¦æä¸ãã¦ããã¾ãã
ããµã¼ãã¹ã«å¤§ããå½±é¿ä¸ãããããªå¤§äºãªæ å ±ã£ã¦ããã¾ãããããã¨ãã°åºåé ä¿¡ãµã¼ãã¹ã ã¨åºåã®å価è¨å®ã§ãããã®ãããªé ç®ã®è¨å®ä½æ¥ãç»é¢ããã½ã¡ã½ã¡ï¼ã¤ãã¤å¤æ´ããã®ã¯å¤§å¤ãªã®ã§CSVã§ä¸æ¬ã§å¤æ´ã§ããæ©è½ãããæãã«éçºããã¨åã°ããã¨ããå ´é¢ã¯ç®¡çç»é¢ãéçºãã¦ãã人ã«ã¯ãããã話ã ã¨æãã¾ããããã¦ãããã®é ç®ãè¨å®ã§ããããã«ããããã¨ãã声ãã§ã¦ãã¦ãCSVããããããªé ç®ãè¨å®ã§ãã便å©æ©è½ã¸ã¨çºå±ãã¦ãã£ãããããã¨ãã
ãããã人éã¯ãã¹ããããã®ã§ããä¸æ¬å¤æ´ã®ããå¤æ´ããããã¼ã¿ãå¤ãã®ã§ãããè¨å®ãééã£ã¦è¨å®ãã¦ãã¾ã£ãã¨ãã«æ°ã¥ãã®ãé ããå¯è½æ§ãããã¾ããããããã¦ãã®çµæãµã¼ãã¹ã«å¤§ããªå½±é¿ãä¸ãããã¨ãã
ããã 欲ããã¨è¨ãããããä½ãã®ã§ã¯ãªãããã®æ©è½ã£ã¦æ¬å½ã«å¿ è¦ãï¼ããã¨ã³ã¸ãã¢èªèº«ãæèããã®ã¯æ®éã«å¤§äºãªãã¨ã§ãããããã®æ©è½ã£ã¦æ±ç¨ããã¦ãªãã§ãã§ãã¦äºæ ã«ã¤ãªããããããªããï¼ãããééãã¦è¨å®ããã大ããªäºæ ã«ãªãããã ãã©ããã®ã¨ãã£ã¦ã©ãããæ å ±ãå¾ããç¥ããããï¼ãã¿ãããªè¦ç¹ã大äºããªã¨ãããã¦å®å ¨ã«ä½¿ããä»çµã¿ãèãã¦çã§ä½ã£ã¦ãããã¨ã大äºããªã¨ã
ããã®ãããªæè¦ã¯ã¨ã³ã¸ãã¢ã ããè¨ããé¨åãããã¨æããã¨ã³ã¸ãã¢ããã©ãã©ãææ¡ãã¦ããã¾ããããããããã¨ã³ã¸ãã¢ããããã¼ã ã¯å¼·ãã¨æãã
ã·ã³ãã«ãª PHP7ãã¤ã¯ããã¬ã¼ã ã¯ã¼ã¯ Karen
ãã®è¨äºã¯ PHP7 㧠PSR-7 㨠Middleware ã使ããã¤ã¯ããã¬ã¼ã ã¯ã¼ã¯ãæ¸ãã¦ã¿ã ã®ç¶ç·¨ã§ãã
ã³ã¼ã㯠https://github.com/brtriver/karen
ååã¾ã§ã®è¨äºã®æµãããã£ããã¨æ¸ãã¨
- Slim3 ã PSR-7 㨠Middleware ãæ¡ç¨ãã¦ããã®ã§ãPHP7ã®ç¡åã¯ã©ã¹ã使ã£ã¦ã¿ã
- ãã£ã¨èããã®ã»ã欲ãããªã PHP7㧠PSR-7 㨠Middleware ã使ã£ããã¤ã¯ããã¬ã¼ã ã¯ã¼ã¯ãä½ã£ã¦ã¿ã(Karen v0.1)
ãã ãèãä½ãããã¦ã¨ã³ããã¤ã³ãã®ã³ã¼ãã«è²ã æ¸ããªãã¦ã¯ãªããªããªã£ã¦ãããã¯è¦éããæªããªã£ãã®ã§ããå°ãæ´çããã£ã¤ãæ¸ãã¦ã¿ã(v0.2)
Karen ã使ã£ãã³ã¼ã
解説ã¯ãã¨ã§ããã¾ãã
<?php $app = new YourFramework(); // Karenã¢ããªã±ã¼ã·ã§ã³ãæ¡å¼µããã¢ããªã±ã¼ã·ã§ã³ $app->run(); $app->sendResponse();
ã®ããã«æ¸ããããPHP7ãªã®ã§ãç¡åã¯ã©ã¹ãå©ç¨ãã¦
<?php require __DIR__ . '/../vendor/autoload.php'; $app = new class extends Karen\Framework\Karen { public function action($map) { // hello name controller sample. $map->get('hello', '/hello/{name}', function($args, $controller) { $name = $args['name']?? 'karen'; return $controller->render('[Karen] Hello, ' . $name); })->tokens(['name' => '.*']); return $map; } }; $app->run(); $app->sendResponse();
ã®ããã«æ¸ããã¨ãã§ãã¾ãã
Karen ã®æ§æ
Applicationã®ã¤ã³ã¿ã¼ãã§ã¼ã¹ãç¨æãã¾ãããã¤ã³ã¿ã¼ãã§ã¼ã¹ã§ã¯
- ä½ãããã®ãµã¼ãã¹ã³ã³ãã(DI)ãæ§ç¯ãã
- ä½ãããã®Middlewareãå®ç¾©ãã
- ä½ãããã®ã«ã¼ãã£ã³ã°ãããªã¯ã¨ã¹ãã«ãããããã«ã¼ãã£ã³ã°ã¨å¦çã決å®ãã
- å®ç¾©ããMiddlewareã¨æ±ºå®ããã«ã¼ãã£ã³ã°ã®å¦ç(ã³ã³ããã¼ã©ã¼)ãè¡ã
ã¨ããã«ã¼ã«ã ãã決ãã¦ãã¾ãã
ããã¦ããããã¯`$app->run()` ãå¼ã¶ãã¨ã§é çªã«ã¡ã½ãããå¼ã°ããæ§ç¯ãããã¢ããªã±âã·ã§ã³ããæå¾ã« `$app->sendResponse()` ãå©ããã¨ã§ä½ãããã®ã¬ã¹ãã³ã¹ãè¿ããã¾ãã
ãããããã³ãã¬ã¼ãã¡ã½ãããã¿ã¼ã³ã«ãªã£ã¦ãã¦ããããªæãã§ãã
<?php abstract class Application { .... public function run() { $this->container(); $this->middleware(); $this->route(); $this->response(); } }
ããã¦ãKaren ã¯ãã®Applicationã¤ã³ã¿ã¼ãã§ã¼ã¹ãå®è£ ããApplicationã¯ã©ã¹ããã¼ã¹ã«ã
- ãµã¼ãã¹ã³ã³ããã« Pimple
- Middleware ã®ã©ã¤ãã©ãªã« Relay
- ã«ã¼ãã£ã³ã°ã«Aura.Router (Karen2ã®ãµã³ãã«ã§ã¯FastRoute)
ã使ãããã«å®è£ ãã¦ãã¾ãã
å®éã¯ã«ã¼ãã£ã³ã°ã«ãããããå ´åã®å¦çã¯æ¸ããã¦ããªãã®ã§ããã®Karenã¯ã©ã¹ãæ¡å¼µããå¿
è¦ãããã¾ãã
ããããæåã«æ¸ããç¬èªã¢ããªã±ã¼ã·ã§ã³ã¯ã©ã¹ã使ã£ãã³ã¼ãããç¡åã¯ã©ã¹ã使ã£ãã³ã¼ãã«ãªãã¾ãã
Karen ã®ã³ã³ããã¼ã©ã¼
Karen ã§ã¯ã¢ããªã±ã¼ã·ã§ã³ãã responseã¡ã½ãããã³ã¼ã«ããã¨ãã«ã«ã¼ãã£ã³ã°ã«å®ç¾©ãããcallableãªãã®ãMiddlewareãã¨ããã¦å®è¡ããã¾ãããã®è²¬åãã³ã³ããã¼ã©ã¼ã«ã¾ããã¦ãã¾ããããã¦ãã¢ããªã±ã¼ã·ã§ã³ã§å©ç¨ããã³ã³ããã¼ã©ã¼ãå·®ãæ¿ããäºãå¯è½ã«ãã¦ãã¾ãã
é常ã¯ãcontainerã¡ã½ããã§pimple($c)ã«ä»¥ä¸ã®ããã«ã³ã³ããã¼ã©ã¼ãçªã£è¾¼ãã ãã§ããã
<?php $c['controller'] = new Controller();
Twigãã³ãã¬ã¼ãã使ãã¤ã¤ããã®ããã®ã¡ã½ãã(renderWithT) ã使ããããã«æ¡å¼µãããã®ãå®ç¾©ããããã«ã¯
<?php $c['controller'] = function($c) { $controller = new class extends Controller{ use Templatable; }; $controller->setTemplate($c['template']); return $controller; };
ã®ããã«Controllerã¯ã©ã¹ãTraitãå©ç¨ããã¯ã©ã¹ã«ç¡åé¢æ°ã§æ¡å¼µããã ãã§OKã§ããPHP7便å©ã§ããã
ãã¡ããç¬èªã®ã³ã³ããã¼ã©ã¼ãå®ç¾©ãããã¨ãã§ãã¾ãããæ©è½ã追å ãããã®ã§ããã°ä¸ã®ããã«Traitãç¨æããã°ä»£æ¿äºè¶³ããããããã¾ããã
ã³ã³ããã¼ã©ã¼ã¯ã«ã¼ãã£ã³ã°ã«ä¸è´ããã¨ãã«å¼ã°ããcallableãªãã®ãææ¡ãã¦ãã¾ããããã®ã¯ãã¼ã¸ã£ã¼ã¯å¼æ°ã¨ã㦠$args 㨠$controller ãåãåãã¾ãã
$argsã¯ãã¹ã§å®ç¾©ããåå¾ããããã©ã¡ã¼ã¿ãå
¥ã£ã¦ãã¦ãååãkeyã¨ãã¦ã¢ã¯ã»ã¹ã§ãã¾ãã
ã¾ãã$controllerã¯ã³ã³ããã¼ã©ã¼ã¯ã©ã¹èªèº«ã§ããRequestã¨Responseã«ã¯ $controller->request, $controller->responseã§ã¢ã¯ã»ã¹ã§ãã¾ãã
ãã¡ããããã®Reuqestã¨Response㯠Middleware ãé©ç¨ãããå¾ã®ãªãã¸ã§ã¯ããå
¥ã£ã¦ãã¾ãã
ãã¨ã¯ Middleware ã®ä»æ§ã«å¾ã£ã¦ $response ãè¿ãããã«ãã¾ãã
<?php $map->get('hello', '/hello/{name}', function($args, $controller) { $name = $args['name']?? 'karen'; return $controller->render('[Karen] Hello, ' . $name); })->tokens(['name' => '.*']);
Traitã§è¿½å ããã¡ã½ãããªã©ã$controllerãéãã¦å¼ã³åºããã¨ãã§ãã¾ãã
<?php // with twig $map->get('render_with_twig', '/template/{name}', function($args, $controller) { return $controller->renderWithT('demo.html', ['name' => $args['name']]); });
ã¾ããJsonã®ã¬ã¹ãã³ã¹ãè¿ãããå ´åã¯return ãJsonResponseã«ãªã£ã¦ããã°ããã®ã§
<?php $map->get('json', '/json/{name}', function($args, $controller) { return new \Zend\Diactoros\Response\JsonResponse(['name' => $args['name']]); });
ã®ããã«ããã°ãã¾ãã§ãã¾ã(ãã ããMiddlewareã§é©ç¨ããã¦ãã $controller->response ãç ´æ£ãã¡ããã¾ãã)
Karenãå©ç¨ãã¦ãªã¬ãªã¬ãã¬ã¼ã ã¯ã¼ã¯ã®ä½ã
ã§ãKaren 㯠Applicationã¤ã³ã¿ã¼ãã§ã¼ã¹ãå®è£ ãããã³ãã¬ã¼ããã¿ã¼ã³ã«å¾ã£ãä½ãã«éããªãã®ã§ããã®ãã¿ã¼ã³ã«å¾ã£ã¦ããããã°å¥½ããªãã®ãæ¸ãã°ããã¨æãã¾ãã
éä¸ã§éãã©ã¤ãã©ãª(ã³ã³ãã¼ãã³ã)ã«å·®ãæ¿ãã.. ãªãã¦ãã¨ããã¾ããããªãã¨æãã®ã§ãæåã«ä½¿ãããã³ã³ãã¼ãã³ããããç¨åº¦æ±ºãã¦æ¸ãã¦ãã¾ãã¨ãã§ããããããªãã§ããããã
ãã¨ãã°ããµã³ãã«ã¨ã㦠Aura.Router ã§ã¯ãªã FastRoute ã使ã Karen2 ãä½ãå ´åã¯ãrouteã¡ã½ããã代ãããrouteçµæã使ãresponseã¡ã½ãããããã«ä¼´ã£ã¦æ¸ãæãããã§ãããããã ãã§ãã¨ã®å¦çã¯åãã§ãã
- Aura.Router ç
<?php class Karen extends Application { .... public function route() { $map = $this->c['router']->getMap(); // define routes at an action method in an extended class $map = $this->action($map); $this->route = $this->c['router']->getMatcher()->match($this->request); } public function response() { if (!$this->route) { $response = $this->response->withStatus(404); $response->getBody()->write('not found'); return; } // parse args $args = []; foreach ((array)$this->route->attributes as $key => $val) { $args[$key] = $val; } // add route action to the queue of Midlleware $this->addQueue('action', $this->c['controller']->actionQueue($this->route->handler, $args)); } }
- FastRoute ç
<?php class Karen extends Application { .... public function route() { $this->c['handlers'] = function () { return $this->handlers(); }; $dispatcher = $this->c['dispatcher']; $this->route = $dispatcher->dispatch($this->request->getMethod(), $this->request->getUri()->getPath()); } public function response() { switch ($this->route[0]) { case \FastRoute\Dispatcher::NOT_FOUND: echo "Not Found\n"; break; case \FastRoute\Dispatcher::FOUND: $handler = $this->route[1]; $args = $this->route[2]; $this->addQueue('action', $this->c['controller']->actionQueue($handler, $args)); break; default: throw new \LogicException('Should not reach this point'); } } }
ã¡ãªã¿ã«ããã¼ã«ã«ã§ãã³ãåãã¨ãå§åçã« FastRoute éãã§ãã
Middleware ã©ã¤ãã©ãªãå°å ¥ãã¦ã¿ã
Karen 㯠Middleware ãæã£ã¦ããã®ã§ãpsr7-middlewares ãç°¡åã«ä½¿ãã¾ã
composer require oscarotero/psr7-middlewares
ã§ã¤ã³ã¹ãã¼ã«ããã°ãã¨ã³ããã¤ã³ãã®ã³ã¼ãã§middlewareãqueueã«è¿½å ããã ãã§ã
<?php require __DIR__ . '/../vendor/autoload.php'; $app = new class extends Karen\Framework\Karen { // middleware ã追å ãã public function middleware() { $this->addQueue('responseTime', Psr7Middlewares\Middleware::responseTime()); } public function action($map) { // hello name controller sample. $map->get('hello', '/hello/{name}', function($args, $controller) { $name = $args['name']?? 'karen'; return $controller->render('[Karen] Hello, ' . $name); })->tokens(['name' => '.*']); return $map; } }; $app->run(); $app->sendResponse();
ããã§ã¬ã¹ãã³ã¹ãããã«å¦çæéã追å ãããã¨ãã§ãã¾ããã
X-Response-Time:8.789ms
便å©ã
Karen ãä½ã£ã¦ã¿ã¦
- ç¡åã¯ã©ã¹ã¯ããã£ã¨ããã®ã«ã¯æããªå ´é¢ã¯ããããã¨ãã°ãã¹ãã§ç¡åã¯ã©ã¹ã使ã£ã¦å¼ã³åºãé åºãæ£ãããã©ãã®ã³ã¼ããæ¸ããã
<?php class ApplicationTest extends \PHPUnit_Framework_TestCase { public function testRunOrder() { $app = new class extends Application{ public $passed = ''; public function container() { $this->passed .= 'container->'; } public function middleware() { $this->passed .= 'middleware->'; } public function route() { $this->passed .= 'route->'; } public function response() { $this->passed .= 'response'; } }; $app->run(); $this->assertSame('container->middleware->route->response', $app->passed); } }
- Middleware ã«ä¹ã£ãã¦ããã°ãè²ããªã©ã¤ãã©ãªããã®ã¾ã¾ä½¿ããã¡ãªããã¯å¤§ããããã¨ãã°psr7-middlewares
- PSR-7 ã«æºæ ããRequestãResponseã£ã¦ãããªã«ç¡ãããå·®ãæ¿ããããªãå ´é¢ã£ã¦æãæµ®ãã°ãªãã
- ããç¨åº¦æºåããããã¬ã¼ã ã¯ã¼ã¯ã®ã»ãããªã¬ãªã¬ãã¬ã¼ã ã¯ã¼ã¯ãã楽ã
- ã¡ã½ããã®æ»ãã®åãå®ç¾©ã§ããã®ã§ãã¡ããã¨è½ã¡ã¦ãããã®ã¯æ¥½(ãã ãå®è¡æ)
PHP7 㧠PSR-7 㨠Middleware ã使ããã¤ã¯ããã¬ã¼ã ã¯ã¼ã¯ãæ¸ãã¦ã¿ã
ã³ã¼ãã¯ãã¡ããhttps://github.com/brtriver/karen
[追è¨]
ãã®è¨äºã«æ¸ãã¦ããã³ã¼ãããããã«æ¹è¯å ãã¦Applicationã¬ã¤ã¤ã¼ãä½ãã¾ãã(v0.2)
詳ããã¯ãã£ã¡ã®è¨äºãåç
§ãã°
http://d.hatena.ne.jp/brtRiver/20160106/karen_framework
ãã®è¨äºã®æç¹ã®ã³ã¼ã(v0.1)ãè¦ããå ´åã¯
https://github.com/brtriver/karen/tree/v0.1.3
ããã©ããã
ãªã«ããï¼
PSR-7ãç¨æããã¦ããã³ã³ãã¼ãã³ããè²ã
好ããªã®ãé¸æã§ããæ代ãæ¥ã¤ã¤ããã¾ãã
ãã¨ãã°zend-expressiveã¨ãã
ãã ãã¬ã¼ã ã¯ã¼ã¯ãããã°ã£ã¦ããããæ½è±¡åãããã¨ãã¦ãã®ã§ããããã£ã¨ã·ã³ãã«ã§ããããªãã¨ã
ã¨ããããã§ãã³ã³ãã¼ãã³ããããåºãã«ãã¦ãããã¼ã£ã¨æ¸ãããã©ããªãããã¤ãã¦ã¿ããã£ãã®ã§æ¸ããã ãã¨ããã
çµæãããªæãã«
https://github.com/brtriver/karen/blob/master/web/index.php
試ãã¦ã¿ãã人ã¯
php -r "eval('?>'.file_get_contents('https://getcomposer.org/installer'));" php composer.phar create-project brtriver/karen ./<ãã¹> cd <ãã¹> make server // http://localhost:8888/hello/karen_girls
ã§ã
Karenã§ãã£ããã¨
PSR-7 ã¨Middleware ã¯èªç±ã«å·®ãæ¿ããããããã«
éã«ããã¨ããµã¼ãã¹ã³ã³ãã(DI)ãã«ã¼ãã£ã³ã°ã¯ãã¬ã¼ã ã¯ã¼ã¯ã¨ãã¦èã«ãªã£ã¦ã¦ãããããªã¨ã
ãã¬ã¼ã ã¯ã¼ã¯ã®ã³ã³ããã¼ã©ã¼ã¯èã
ã«ã¼ãã£ã³ã°ã®ã¯ãã¼ã¸ã£ã¼ã§å°ãæ¸ããããããããã®Controllerã¯ã©ã¹ã¨Templatableãã¬ã¤ãã ããç¨æã
ãããããå¦çããããã¨ãããã¨ãã©ãã«(ã³ã¡ã³ã)ãããã¯ä»ãã
ã¹ã³ã¼ããéãããããããããªãã§ããããã¾ã§ãã©ãã«ã
ãã ã¤ã³ã©ã¤ã³ã³ã¡ã³ããæ®ãããããããããããªã¨ã
<?php container: { $c = new Container(); .... } middleware: { $relayBuilder = new RelayBuilder(); ... }
ãããã«ãµã¼ãã¹ã³ã³ããç¡ãã¨è¾ãã
ã³ã³ãã㯠Container Interop ã¨ããã®ãç¨æããã¦ãããã¾ãããã¾ã å ¬å¼ã¨ããã»ã©ã§ããªãã®ã¨ã好ããªã®ä½¿ãã°ãããããã¨ãããã¨ã§ä½¿ãæ £ãã Pimpleãé¸æã
å¥ã®ã³ã³ãã使ã£ãã¨ãã¦ããKarenç¨åº¦ã®ãã¬ã¼ã ã¯ã¼ã¯ã§ããã°ãããªã«æ¸ãæããã®ã¯å¤§å¤ãããªãã¨æãã
ã«ã¼ãã£ã³ã°ã¯ Aura.Router
ã«ã¼ãã£ã³ã°ã¯ã¯ãã¼ã¸ã£ã¼ãå®ç¾©ã§ããã°ããã®ã§ã使ã£ããã¨ããã Aura.Routerã§
<?php ... $map->get('hello', '/hello/{name}', function($args, $controller) { $name = $args['name']?? 'karen'; return $controller->render('Hello, ' . $name); })->tokens(['name' => '.*']);
PHP7ã 㨠issetãããªã㦠"??" 使ããã®ä¾¿å©ã§ããã
Karenã§ã¯Controllerã¯ã©ã¹ãç¨æãã¦ã便å©é¢æ°ãRequest, Responseãªãã¸ã§ã¯ãã«ã¯ãã¼ã¸ã£ã¼ããã¢ã¯ã»ã¹åºæ¥ãããã«ãã¦ããã¾ãã
ã³ã³ããã¼ã©ã¼ã¯ã©ã¹ã®æ¡å¼µãç¡åã¯ã©ã¹ã§ãã§ããããã«
å¿ è¦ãããã°Controllerãextendsããå°ç¨ã®ã³ã³ããã¼ã©ã¼ãç¨æããã°ããã®ã§ãããPHP7ã§ç¡åã¯ã©ã¹ä½¿ããã®ã§ç¡åã¯ã©ã¹ã§Controllerãæ¡å¼µã§ããããã«ãã¦ã¿ã¾ããã
ãã¨ãã°é常ã¯
<?php ... $c['controller'] = function($c) { return new Controller($c['request'], $['response']); };
ã¨ãã³ã³ããã¼ã©ã¼ã®ç¨æãã¾ããã
Templatable ãã¬ã¤ããå©ç¨ã§ããããã«ããControllerãç¨æãããå ´åã¯
<?php ... $c['controller'] = function($c) { $controller = new class($c['request'], $c['response']) extends Controller{ use Templatable; }; $controller->setTemplate($c['template']); return $controller; };
Middleware 㯠Realy ã§
詳ããã¯Realyã使ã£ã¦ã¿ãã
ããã£ã¦ç¥ã£ã¦ã人ã¯ç¥ã£ã¦ã Mojavi ã®ã¢ã¬ã§ãããã(æããã
æ¸ãã¦ã¿ã¦ã©ãã ã£ãã®ï¼
- ã¾ã ããå°ãã³ã¼ããæ´çãã¦æ¸ãã¤ããã
- ã³ã¼ãæ¸ãã®ãç²ããã®ã§ãææ³ã¯ãã¤ãã®LTã®ãã¿ã¨ãã¦ã
ç¡åã¯ã©ã¹(PHP7)ããã¤ã¯ããã¬ã¼ã ã¯ã¼ã¯ã§ä½¿ã£ã¦ã¿ã
PHP7ããã¯ç¡åã¯ã©ã¹ã使ããããã«ãªãã¾ããã
ã©ããã£ãå ´åã«ç¡åé¢æ°ã使ãæ©ä¼ãããããªãã¨èãã¦ããã¨ããµã¨ãã¤ã¯ããã¬ã¼ã ã¯ã¼ã¯ã®ç¡åé¢æ°é¨åã®ä»£ããã«ä½¿ãã¨è¯ãããããªããã¨æããã£ã¦ã¿ã¾ããã¨ããã®ããã®è¨äºã
[追è¨]
- å®éã«Slim3 ã®ã¢ããªã§ä½¿ããããã«composerã§ã¤ã³ã¹ãã¼ã«ã§ããããã«ã³ã¼ããæ´çããªããã¦ç¨æãã¦ã¿ãã
- Slim3 ã§ã¯ãªãããã£ã¨èãPHP7ãã¬ã¼ã ã¯ã¼ã¯ãæ¸ãå§ãã¦ã¿ãè¨äºã¯ãã£ã¡ã
ç¡åé¢æ° vs ç¡åã¯ã©ã¹
ã¾ããPSR-7ã§ãªã¯ã¨ã¹ãã¨ã¬ã¹ãã³ã¹ã®ã¤ã³ã¿ã¼ãã§ã¼ã¹ã決ããããããã«å¾ã£ããã¬ã¼ã ã¯ã¼ã¯ãããã«ã¦ã§ã¢ãåºã¦ãã¦ãã¾ããããã§ãPSR-7 ã®ãµãã¼ãããã Slim3 㨠PHP7 試ãã¦ã¿ã¾ãã
ã¾ãã¯ãSlim3 ã®ããã¥ã¡ã³ãéãã« Hello World ããã¨:
<?php use \Psr\Http\Message\ServerRequestInterface as Request; use \Psr\Http\Message\ResponseInterface as Response; require __DIR__ . '/../vendor/autoload.php'; $c = new \Slim\Container; $c['greet'] = 'Hello '; $app = new \Slim\App($c); $app->get('/hello/{name}', function (Request $request, Response $response, $args) use ($app){ $response->write($app->getContainer()['greet'] . $args['name']); return $response; }); $app->run();
ãªã¯ã¨ã¹ãã¨ã¬ã¹ãã³ã¹ã®ãªãã¸ã§ã¯ããç¡åé¢æ°ã«æ¸¡ããã¦ããã®ã§ãã¬ã³ããªã³ã°ããã¨ã㯠Slimã«ç¨æããã¦ããã¬ã¹ãã³ã¹ã® `write` ã¡ã½ãããå¼ã³ã¾ãã
ã·ã³ãã«ã§è¯ãã®ã§ãããæ¯å Request 㨠Response ãæèãã¦ã³ã¼ãæ¸ããªãã¦ãæ¸ããããã®æ½è±¡åã欲ãããªãã¾ããããã§ãMyControllerã¯ã©ã¹ãç¨æãããã㧠Requestã¨Responseã¸ã®å¦çãè¡ãããã«ãã¦ã¿ãã®ã以ä¸ã®ã³ã¼ã:
<?php ... $app->get('/hello/{name}', new class($app) extends MyController { public function action($args) { return $this->render($this->container['greet'] . $args['name']); } });
MyControllerãæ½è±¡ã¯ã©ã¹ã¨ãã¦å®ç¾©ããããªããactionã¡ã½ãããå¼ã°ããããã«ãã¦ããã¾ãã
ãªã®ã§ããã®ç¡åã¯ã©ã¹ã§ã¯ actionã¡ã½ãããæ¸ããã¨ã§åã«ã¼ãã£ã³ã°ãã¨ã«å¦çãè¡ãããã¨ããä»çµã¿ã§ãã
ã¾ããã¬ã¹ãã³ã¹ãªãã¸ã§ã¯ãã¯ç´æ¥ããããrenderã¡ã½ãããç¨æãã¦åä½ããããã«ãã¦ã¿ã¾ããã
ããã§ãã¤ã¯ããã¬ã¼ã ã¯ã¼ã¯ã§ç¡åé¢æ°ã§ã¯å¤§å¤ã ã£ãæ½è±¡åãç°¡åã«è¡ãã¾ãããããæå³ãªã¬ãªã¬ãã¬ã¼ã ã¯ã¼ã¯ãç°¡åã«ã§ãã¾ãã
ãã¤ã¯ããã¬ã¼ã ã¯ã¼ã¯ã ãã§ã¯ã«ã¼ãã£ã³ã°æ°ãå¢ãã¦ããã¨ç¡åé¢æ°ã ãã§ã¯å®è£ ãé£ãããªã£ã¦ããé¨åããæ¯åã¯ã©ã¹ãå®ç¾©ã`__invoke`ãå©ç¨ããæ¹å¼ã§ã¯ãªããããç¨åº¦ç¡åã¯ã©ã¹ã§ãããæ¸ããã¨ããæ¹å¼ã¯ã¡ãªãããããããã§ãã
Twigãã³ãã¬ã¼ãã使ãããã«Traitã§
Slim3 㯠Pimpleãã¼ã¹ã®ãµã¼ãã¹ã³ã³ãããããã®ã§ããã³ãã¬ã¼ãã¨ã³ã¸ã³(twig)ã `view` ã«ä»¥ä¸ã®ããã«ã»ãããããã¨ã§
<?php $app = new \Slim\App(); // Get container $container = $app->getContainer(); // Register component on container $container['view'] = function ($container) { $view = new \Slim\Views\Twig('path/to/templates', [ 'cache' => 'path/to/cache' ]); $view->addExtension(new \Slim\Views\TwigExtension( $container['router'], $container['request']->getUri() )); return $view; };
ã«ã¼ãã£ã³ã°ã§ä»¥ä¸ã®ããã«viewã使ã£ã¦ã¬ã³ããªã³ã°ãã§ãã¾ãã
<?php $app->get('/hello/{name}', function ($request, $response, $args) { return $this->view->render($response, 'profile.html', [ 'name' => $args['name'] ]); });
ãããããã¬ã¤ãã使ã£ã¦éã£ãã¢ããã¼ãã§ä½¿ããããã«ãã¦ã¿ã¾ããã
ãã¬ã¤ããç¨æãã¦ãããã§Twigã®è¨å®é¢é£ãæ¸ãã¦ãã¾ãã¾ãã
ãµã¼ãã¹ã³ã³ããã¯å©ç¨ããç´æ¥ viewããããã£ãç¨æãã¦ãã¾ãã
- TwigTemplatable.php
<?php namespace Karen\Controller; use \Psr\Http\Message\ResponseInterface as Response; trait TwigTemplatable { private $templatePath; private $cachePath; private $view; public function useTwig() { $this->templatePath = __DIR__ . '/../../templates/'; $this->cachePath = '/tmp/'; // Register component on container $this->view = new \Slim\Views\Twig($this->templatePath, [ 'cache' => $this->cachePath ]); $this->view->addExtension(new \Slim\Views\TwigExtension( $this->container['router'], $this->container['request']->getUri() )); } public function renderTwig($path, $args) { $this->useTwig(); $this->view->render($this->response, $path, $args); } }
ãããã«ã¼ãã£ã³ã°ã®MyControllerã§useããrenderTwigãéãã¦ã¬ã³ããªã³ã°ãã¾ãã
<?php $app->get('/hello/{name}', new class($app) extends MyController { use TwigTemplatable; public function action($args) { return $this->renderTwig('web.html', ['name' => $args['name']]); } });
ã¢ããªã±ã¼ã·ã§ã³ã大ãããªãã¨ã³ã³ããèªèº«ãè¨ãã¦ããåé¡ãç¡åã¯ã©ã¹ + ãã¬ã¤ããå©ç¨ãããã¨ã§ããç¨åº¦ãã¾ãæ´çã§ããããªæãããã¾ããããããã¾ã§ãããªãã¦ããªãã¨ãæã£ããã
試ãã¦ã¿ã
PHP7ãã¤ã³ã¹ãã¼ã«ããã¦ããã°githubããã³ã¼ãæã£ã¦ããã°è²ã éã¹ã¾ãã
$ git clone [email protected]:brtriver/slim3-anonymous-class.git $ make setup $ make install $ php -S localhost:8888 -t ./web // ãã¨ã¯ãã©ã¦ã¶ãã http://localhost:8888/hello/brtriver ã«ã¢ã¯ã»ã¹ããã°OK
Loggerã¯ã©ã¹ããã¹ãã®ãã³ã«mockãç¨æããªãã¦æ¸ãããã®å·¥å¤«
ãã®è¨äºã¯ãSymfonyã¢ããã³ãã«ã¬ã³ãã¼2015ã®19æ¥ç®ã®è¨äºã§ããã§ãä»æ¥ã¯20æ¥ã§ããã(ããããªããããå¿ãã¦ã¾ãããã
18æ¥ã¯naoyesããã®Symfonyããã¸ã§ã¯ãã®ãã¹ãã«Codeceptionã使ã£ã¦ã¿ãã§ããã
ä»æ¥ã¯11/24 ã«éå¬ããã PHP BLT #1 ã§LTãã¦ããå 容ã§ãããã¾ã çºè¡¨å 容ãã¾ã¨ãã¦ããªãã£ãã®ã§æ¸ãã¾ãã
Symfony ã§ã¯ yaml ã§ãµã¼ãã¹æ§æã®å®ç¾©ãã§ãã
Symfony 㧠ä½ããµã¼ãã¹ãä½ãã¨ããå¿ è¦ãªå¤é¨ãµã¼ãã¹ã次ã®ããã«yamlã§å®ç¾©ãããã¨ãã§ããDI ã³ã³ãã¼ãã³ãã«ãã£ã¦ hoge_manager ãç¨æããã¾ãã
hoge_manager: class: HogeBundle\Service\HogeManager arguments: - @doctrine.orm.entity_manager - @report - @slack_notification - @loger
ããã¦ãHogeManager ã¯ã©ã¹ã¯argumentsã§å®ç¾©ããä½ããã³ã³ã¹ãã©ã¯ã¿ã§åãåãããã«ããã°ããããã§ãã
<?php /** * Hoge Manager */ class HogeManager { public function __construct($em, $reporter, $slack, $logger) { $this->em = $em; $this->reporter = $reporter; $this->slack = $slack; $this->logger = $logger; }
ã³ã³ããã¼ã©ã¼ãã㯠InjectParams ã便å©
ã¾ãããã®ããã«ååãã¤ããä½ãã¯ãã³ã³ããã©ã¼ãããªã©ã¯ `InjectParams` ã使ãã°ã³ã³ã¹ãã©ã¯ã¿ãªã©ã§å©ç¨ãããã¨ãã§ãã¾ãã
<?php namespace HogeBundle\Controller\Hoge; use Symfony\Bundle\FrameworkBundle\Controller\Controller; use Symfony\Component\HttpFoundation\Request; use JMS\DiExtraBundle\Annotation as DI; /** @Route("/hoge") */ class HogeController extends Controller { private $hoge; /** * @DI\InjectParams({ * "hoge" = @DI\Inject("hoge_manager") * }) */ public function __construct($hoge) { $this->hoge = $hoge; }
å¤é¨ã®ä½ããå©ç¨ããã¯ã©ã¹ã®ãã¹ãã¯mockãæ´»èº
ãã¦ããã®HogeManager ã¯ã©ã¹ã®ãã¹ããæ¸ãã¦ã¿ã¾ãããããã®ããã¼ã¸ã£ã®ãã¹ããæ¸ãããã®ã§ã
å¤é¨ã®ä½ãã¯mockã«ãããã¨ã«ãªãã¾ããPhakeã使ãã¨ãããªæãã§ãããã
<?php namespace HogeBundle\Tests\Service; use HogeBundle\Service\HogeManager; class HogeManagerTest extends \PHPUnit_Framework_TestCase { /** * setup */ public function setUp() { $this->logger = \Phake::mock('Psr\Log\LoggerInterface'); ...
ãã㧠`$this->logger` ãæ¯åç¨æããªãã¨ãããªããªãã¾ãã
ãã¯ã mock ãæ¯åæ¸ããªãã¦ããã¹ãæ¸ããããã«æ
£ããã¨å¹¸ãã§ããããã¨ãããã㧠Loggable Trait ãä½ã£ã¦ã¿ã¾ãã
Loggable Trait
<?php namespace Hoge\HelperBundle\Logger; use Psr\Log\LoggerInterface; use Symfony\Component\HttpKernel\Log\NullLogger; trait Loggable { /** @var LoggerInterface */ private $logger; public function setLogger($logger) { $this->logger = $logger; } protected function logger() { if (is_null($this->logger)) { $this->logger = new NullLogger(); } return $this->logger; } }
ã³ã¼ãã¯ãã£ãããã ãã§ãã
loggerã®setterãç¨æãã¦ããã®ã¨ãgetterã§ã¯setããã¦ããªããã°NullLoggerãè¿ãã¦ãã¾ãã
ãªã®ã§ãsetããã¦ããªãã¦ãã¨ã©ã¼ãå±¥ããã«åãã¾ãã
ãªã®ã§ãyamlå®ç¾©ã以ä¸ã®ããã«ãã¾ãã
hoge_manager: class: HogeBundle\Service\HogeManager arguments: - @doctrine.orm.entity_manager - @report - @slack_notification - @loger calls: - [setLogger, ["@logger"]]
ã³ã³ã¹ãã©ã¯ã¿ã§ã¯ãªãsetLoggerãã³ã¼ã«ããããã«æå®ãã¾ãã
HogeManager 㯠Trait ã使ãã®ã§ä»¥ä¸ã®ãããªã³ã¼ãã«ä¿®æ£ãã¾ã
<?php /** * Hoge Manager */ class HogeManager { use Loggable; public function __construct($em, $reporter, $slack) { $this->em = $em; $this->reporter = $reporter; $this->slack = $slack; }
ã³ã³ã¹ãã©ã¯ã¿ã§loggerã渡ããªãã¦ããããªãã¾ããããloggeré¢é£ã®ã¡ã½ããã¯å
¨é¨Traitã«ããã®ã§use Loggable ããã ãã§ãã
ããã§ããã¹ããmockä½ããªãã¦ãNullLoggerãåæã«ä½æãããã®ã§ãã¹ãããã£ãããã¾ãã
ã³ã³ã¹ãã©ã¯ã¿ã§æ¸¡ãä½ããå¢ãããããè¨è¨ãèããªããææãããããªã
ãã¨ããã®Loggableã使ãã¨ããããã¨ã¯ããã®ãµã¼ãã¹å
¨ä½ãä¾åãã¦ãããã®ã¯ã³ã³ã¹ãã©ã¯ã¿ã§æ¸¡ãã®ã¯èªç¶ã§è¯ãã®ã§ããã
ãµã¼ãã¹ã®ä¸é¨ã ããä¾åãã¦ãããããªãã®ã¾ã§ãã³ã³ã¹ãã©ã¯ã¿ã§æ¸¡ãããã«ããã¨ãã¹ããè¾ããã®ã«ãªãããããªãã¾ãã
ãµã¼ãã¹ã®ä¸é¨ãå©ç¨ãããããªå¤é¨ã®ä½ãã¯ããã®ä¸é¨ã§å©ç¨ããã¡ã½ããã§æ¸¡ããªã©å¥ã®æ段ãèãã¦ã¿ãã»ããè¯ãã§ãã
Symfony ã§ã¯ç°¡åã«ä¾åé¢ä¿ãã³ã³ã¹ãã©ã¯ã¿ã§æ¸¡ããã®ã§ã¤ãã¤ããªãã§ãæ¸ãã¦ãã¾ããã¡ã§ããã
ã³ã³ã¹ãã©ã¯ã¿ã«å¤§éã«ä½ã渡ããããªè¨è¨ã«ãªã£ã¦ããããæ¬å½ã«ããã¯ã³ã³ã¹ãã©ã¯ã¿ã§æ¸¡ãã¹ããªã®ããã¾ãã¯ã¯ã©ã¹ã®ä»äºãå¤ããããªã©è¨è¨ãå度èããææãªã®ããããã¾ãããã
ã¨ããããã§ã20æ¥ã¯imunewããã§ãDoctrine DBALã§åå¾ãããã¼ã¿ããã£ãã·ã¥ãããã§ãï¼(æ¢ã«å
¬éããã¦ãã¾ããï¼ãã°ãããï¼ãããã»ãã¨ããããªãããã
DBã®åãåãããWebã¢ããªã±ã¼ã·ã§ã³ã§ä¸çªéããªããã¨ã¯ããããã®ã§ããã£ãã·ã¥å¤§äºã§ãããï¼
åå¼·ä¼ã§çºè¡¨ããã¨ãã«å½¹ç«ã¤æ£ãããã¤ã¯ã®æ±ãæ¹
ãã®è¨äºã¯Advent Calendar 2015 - VOYAGE GROUP 6æ¥ç®ã®è¨äºã«ãªãã¾ãï¼
ããã«ã¡ã¯ï¼ç¤¾å
ã§é³é¿ã¨ã³ã¸ãã¢ãã¦ã @brtriver ã§ãã
ä»æ¥ã¯PA*1å±ããçè¦ç¹ã§ãã¤ã¯ã®æ£ããæ±ãæ¹ã«ã¤ãã¦ã話ã§ããã°ãªã¨æããã¢ããã³ãã«ã¬ã³ãã¼ã§æ¸ããã¨ã«ãã¾ããã
ITé¢é£ã§ã¯åå¼·ä¼ãå¤ãéå¬ããã¦ãããåå¼·ä¼ã§çºè¡¨ãããæ©ä¼ãããæ¹ãå¤ãã¨æãã¾ãã
ãã®ã¨ãã«æ®æ®µå©ç¨ããªããã©ä½¿ããã¨ãå¤ãã®ããã¤ã¯ã§ãã
ã§ãããã®ãã¤ã¯ãæ£ãã使ããã«æããã¦ããæ¹ããã©ãã©è¦åãããã¾ãã
æ£ãã使ãããã¨ã§ãçºè¡¨å
容ãããåå è
ã«èããããããªãä¼ãããäºãããä¼ããã¨æãã¾ãã
ããæå³ã«ã©ãªã±ã§ãæ´»ç¨ã§ãããã¿ã§ããè²ã
æ¸ãã¦ã¿ã¾ãã
ãã£ã¦ã¯ãããªããã¨ãè¦ããã ã
æ£ããæã¡æ¹ãè¦ããããã¯ããã£ã¦ã¯ãããªããã¨è¦ããã¨èªç¶ã¨è¯ãæã¡æ¹ã«ãªãã¨ãããã¨ã§
ãã£ã¡ããã¡ãªãã¨ã«ã¤ãã¦èª¬æãã¦ãã¾ãã
ãã¤ã¯ãå ¥ã£ã¦ãããã©ãã確èªããã¨ãã«ããã(ãã¤ã¯ã®é ã®é¨å)ãå©ãã¦ã¯ãããªã
ãã¤ã¯ã®ãããé¨åãå©ãã¦ç¢ºèªãã人ããã¾ãããããã¯NGã§ãã
ãã¤ã¯ã®é³ãæ¾ãé¨åã¯è¡æã«å¼·ãããã¾ãããææªãã¤ã¯ãå£ãã¦ãã¾ãå¯è½æ§ãããã¾ãã
ãããã©ããããããã¡ãµãã§ãããã®é¨åã "ã«ãªã«ãª" ãã¦ã¿ã¾ãããã
ããã§ã¹ãã¼ã«ã¼ããèããã¦ããã°å
¥ã£ã¦ããã¨ãããã¨ã§ããã
ããã説æããããã«ã¯ "ãã¦ãªã³ã°" (é称ãã¦ã) ã«ã¤ãã¦ç°¡åã«èª¬æãã¦ããå¿
è¦ãããã¾ãã
ãã¦ãªã³ã°ã¨ã¯ "ãã¼ã³" ã¨ã "ãã¼ã³" ã¨ããªãã¢ã¬ã®ãã¨ã§ãã
ææªã¹ãã¼ã«ã¼ãå£ãã¦ãã¾ãå¯è½æ§ãããã¾ããã¾ãã客ãããä¸å¿«ã§ãããã
ãã¦ãªã³ã°ã¯ç¹å®ã®é³åã ãã¤ã¯ => (å¢å¹
) => ã¹ãã¼ã«ã¼ => ãã¤ã¯ => (å¢å¹
) => ã¹ãã¼ã«ã¼ ã¨ã«ã¼ããããã¨ã§çºçãã¾ãã
è²ããªè¦å ãããã®ã§ãããä¸çªåãããããé¿ããæ¹æ³ã¯ã«ã¼ãããªãããã«ãããã¨ã§ãã
ãªã®ã§ããã¤ã¯ãã¹ãã¼ã«ã¼ã«åãããããªãã¨ããã£ã¦ã¯ããã¾ããã
é常ã®åå¼·ä¼ã ã¨ã¹ãã¼ã«ã¼ã¨ãã¤ã¯ãããã»ã©è¿ãã«ããã¨ãããã¨ã¯ç¡ãã¨æãã¾ããç¥ã£ã¦ããã¦ãã ããã
ã¾ããåå¼·ä¼ã§ãã¦ãªã³ã°ãããçºçããã¨ãã¯ãã¹ãã¼ã«ã¼ã®ä½ç½®ã¨çºè¡¨è
ã®ãã¤ã¯ã®ä½ç½®ã調æ´ãã¾ãããã
ãããã¹ãã¼ã«ã¼ãçºè¡¨è
ã®å¾ãã«ãããããªå ´åã¯ãã¹ãã¼ã«ã¼ã®ä½ç½®ããåã«ç½®ãããã«ãããã¨ã§ãã¦ãªã³ã°ã¯é²ãã¾ãã
ãã¨ãæã«ãã¤ã¯ãæã£ã¦è©±ããªãã移åãããããã¨ãããã¹ãã¼ã«ã¼ã®ä½ç½®ãææ¡ãã¦ããã¦
ã¹ãã¼ã«ã¼ã«ãã¤ã¯ãåããªãããã«ãã¾ãããã
ã¡ãªã¿ã«ãããã©ã¤ããã¤ãã³ãã®ç¾å ´ã§ "ã¯ã³ãã¼ãã¯ã³ãã¼..." ã¨ãã£ãçºè¨ãã¦ãã人éããã¾ããã
å½¼ãã¯ãã¤ã¯ãã§ãã¯ã¨ã¢ãã¿ã¼ã®ã¹ãã¼ã«ã¼ã®ãã¥ã¼ãã³ã°ããã¦ããPAãããã¡ã§ãã
"ã¯ã³" ã®é¨åã§ä½ãé³åã "ãã¼" ã®é¨åã§é«æ¸©åãçºå£°ãã¦ã¹ãã¼ã«ã¼ããã¦ãªã³ã°ãããã¤ã³ããæ¢ãã¦ããã§ããã
ãã¦ããããé³åã®ã¬ãã«ãä¸ããããã¦ã¾ãã
ãã£ã¨ã話ããããã®ã§æ»ãã¾ãã
ãã¤ã¯ããé¢ãããã¦ã¯ãããªã
ããã»ã©ãã¦ãªã³ã°ã«ã¤ãã¦èª¬æãã¾ããã
話ã人ããã¤ã¯ããé¢ãã¦ããã¨ãã¹ãã¼ã«ã¼ããèãããããã«ããããã«ã¹ãã¼ã«ã¼ã®ããªã¥ã¼ã ãä¸ãããã
ãã¤ã¯ã®æ度(ã²ã¤ã³)ãä¸ããå¿
è¦ãããã¾ãã
ãããããã¨ã§ãå¨ãã®ä½è¨ãªé³ãå¢å¹
ããã¦ãã¾ããã¦ãªã³ã°ãããããªã£ã¦ãã¾ãã¾ãã
ãªã®ã§ããã¤ã¯ã«ã¯ã§ããã ãè¿ã¥ããæ¹ãè¯ãã§ãã
ã©ãã»ã©è¿ã¥ããæ¹ãè¯ããã¯å°å£°ã®å¤§ãããªã©ãããã¾ãã®ã§è²ã
æ¢ã£ã¦ã¿ã¦ãã ããã
å°ãªãã¨ãããã¤ã¯ãé ãã¦å£°ãå°ããã¨ãã«ã¯ãã¤ã¯ã«è¿ã¥ãããã«ãã¾ãããã
ã¹ãã¼ã«ã¼ã®ããªã¥ã¼ã ãä¸ããã®ã¯ãã®æ¬¡ã®æ段ã§ãã
æ¼å°ã ã¨ããã¹ã¿ã³ãã«ãã¤ã¯ãè¨ç½®ããã¦ãããã¨ãããã¾ãããã
èªåã¯è¦³å®¢å´ãè¦ã¦è©±ããããã¹ã¯ãªã¼ã³å´ãè¦ã¦è©±ããããããããã¨ãããå ´åã¯æã«æã£ã¦è©±ãããã«ãã¦ãã¾ãã
ãããããã¨ã§ããã¤ã¯ã¨ã®è·é¢ãä¸å®ã«ãã¦è©±ããã¨ãã§ãã¾ããUSTREAMãªã©ã®é
ä¿¡ããã¦ããå ´åã§ãä¸å®ã®é³éã§æµããããã§ãã
ãã¤ã¯ã®ãããã®ä¸ååãæããªã
ãã¤ã¯ã«ã¯æåæ§ã¨ãããã®ãããã¾ãã
çºè¡¨è
ã使ããã¤ã¯ã§æã«æã¤ãããªã¿ã¤ãã¯å¤§ä½åä¸æåæ§ã¨ãããã¤ã¯ã«ãªãã¨æãã¾ãã
ããã¯ãã¤ã¯æ£é¢ã®é³ãä¸çªããæ¾ãã¾ãã横ããã®é³ã¯ã»ã¨ãã©æ¾ããªããããªä»çµã¿ã«ãªã£ã¦ãã¾ãã
ãããããã¨ã§ä½è¨ãªé³ãæ¾ããã«ãã¦ãªã³ã°ã«ãå¼·ããªã£ã¦ããã®ã§ãã
ãããã¤ã¯ã®ãããã®ä¸ååãæã§è¦ã£ã¦ãã¾ãã¨æåæ§ããªããªãç¡æåæ§ã«ãªã£ã¦ãã¾ãã¾ãã
ç°¡åã«ãã¦ãã¾ãã声質ãã¢ã³ã¢ã³ã¨ããã£ãæãã«ãªãã¾ãã
åèæ£ãããã¤ã¯ã®æ¡ãæ¹
ãããã³ããã³ããã¤ã¯ã®ãããé¨åãæã£ã¦æã£ã¦ããããã¾ãããå
¨é¨è¦ããªããããªæ¡ãæ¹ããã¦ããã¯ãã§ãã
ã¨ã¯ãããåå¼·ä¼ã§ã¯ããããã©ããã¼çãªæã¡æ¹ãããã¦ããæ¹ã¯è¦ããã¨ãªãã®ã§å¤§ä¸å¤«ã ã¨æãã¾ãããã
çªç¶ã±ã¼ãã«ãæããªã
ããã¯ãã¤ã¯ã«éããã§ãããã¹ãã¼ã«ã¼ã®ããªã¥ã¼ã ãä¸ãã£ãç¶æ
ã§ã±ã¼ãã«æãã¨å ´åã«ãã£ã¦ã¯
"ãã³ã" ã¨å¤§ããªãã¤ãºãåºããã¨ãããã¾ãã
ããã¯ä¸æããã¨ã¹ãã¼ã«ã¼ãå£ãã¦ãã¾ãã¾ãã®ã§ã±ã¼ãã«ã¯åæã«æããªãããã«ãã¾ãããã
æ£ãããã¤ã¯ã®æ±ãæ¹
ã¨ããããã§ã¾ã¨ããã¨ä»¥ä¸ã®ããã«ãã¤ã¯ã使ãã¨ãªã¹ãã¼ãèããããã¦çºè¡¨ã®ææ³ãè¯ããªãããããã¾ããã
- ã¹ãã¼ã«ã¼ã®ä½ç½®ã確ãããã
- ã¹ãã¼ã«ã¼ã«ã¯ãã¤ã¯ãåããã¨ãã¦ãã®ã§ä½ç½®ç¢ºèªãã
- ãã¤ã¯ãç´æ¥åããªãããã«æ°ãã¤ãã
- æ¼å°ãããã¤ã¯ãæã«æã¤
- ã©ããã¼æã¡ããªã
- çªã§ã«ãªã«ãªãã¦ç¹ãã£ã¦ãããã確èªãã
- å©ããªã
- ã§ããã ãå£ã«è¿ã¥ãã¦è©±ã
- é³ã大ãããããªã¨æã£ãããã¤ã¯ãå°ãé¢ãã¦èª¿æ´ãã
- çºè¡¨ãçµãã£ããæ¼å°ã«æ»ã
- åæã«ã±ã¼ãã«ãæããªã
ãªã«ã¯ã¨ããããåºæ¥ãéã声ã¯å¤§ããã§ã¯ã£ããã¨æ»èãã話ãããã¨ã¯ãã¤ã¯ã®ä½¿ãæ¹ä»¥åã«å¤§äºã§ããã¯ãã
ãã¾ã
æ親ä¼ã®ä¹¾æ¯ã®æ¨æ¶ã¨ãã§ãçªç¶å«ã³ãããªã£ãå ´åã¯ããã¤ã¯ä½¿ããå«ãã§ãã ããã
æ®éã®åå¼·ä¼ã®ä¼å ´ã®é³é¿è¨åã§ã¯ã³ã³ãã¬ããµã¼éããã¦ãªãã®ã§å¤§ä½ã¹ãã¼ã«ã¼çãã¾ãã
ããã§çããã®çºè¡¨ãããåå è ã«ä¼ããã¤ã¤ãã«ã©ãªã±ã§ãé«å¾ç¹ãçãã¾ããï¼