çŸåšãæãäžè¬çã«äœ¿çšãããŠããWebãµã€ãã®ãã¶ã€ã³ãã¿ãŒã³ã¯ãModel-View-ControllerïŒMVCïŒã§ãã ãã®åºç¯ãªäœ¿çšã¯ãRuby on Railsãã¬ãŒã ã¯ãŒã¯ã®æåãšäººæ°ã«ãããã®ã§ãã çŸåšãMVCã¯ããã¹ãŠã®ãã©ãããã©ãŒã éã§ã®Webéçºã®ã»ãŒå矩èªã§ãã
ããã»ããµãã¢ã¯ãã£ãã«ããŒãããã¿ã¹ã¯ãå®è¡ãããšããçŸä»£ã®ãµã€ãã¯ãŸããŸãå°çšãªãœãŒã¹ã«äŸåããŠããŸãã ããã¯ãç¹ã«ãéçºè ãå€§å¹ ã«ç¬èªã®ãµãŒããŒã®CPUã®ãªãŒããŒãããã軜æžããããšãã§ããŸãçºèŠãAmazonãGoogleã®ã¯ã©ãŠããµãŒãã¹ã«è²¢ç®ããŸããã éåžžãåãµãŒãã¹ã¯ããã¡ã€ã³å ã§å®è¡ãããç¬èªã®ãªãœãŒã¹ã䜿çšããåå¥ã®ãœãããŠã§ã¢ãšããŠèšèšãããŠããŸãã
æ§ãããªäºç®ãæ±ããšããéåžžããœãããŠã§ã¢ã®è€æ°ã®å®å šãªéšåã®ããã®å©çã®è³éã調éããããã«é¡§å®¢ã説åŸããã®ã¯éåžžã«å°é£ã§ãã ç§ã®çµéšã瀺ãããã«ããããã®å€ãã¯ãã¹ã±ãŒã©ããªãã£ã¯ç·æ¥ã®èª²é¡ã§ã¯ãªããšããæèŠã§ãã 圌ãã¯ãå¿é ããªããã°ãªããªãæ¥ã楜ãã¿ã«ããŠããã ã
åææè³ã軜æžããã«ã¯ãéåžžããã®ã¢ããªã±ãŒã·ã§ã³äžã®ææ決å®ãåãå¿ èŠãªãã¹ãŠã®æ©èœãå«ããçµ±åãããããã°ã©ã ãšããŠèšèšãããªããã°ãªããŸããã ãµã€ãã®äººæ°ãæ¥éã«é«ãŸããšãåé¡ã«ãªããŸãã äžååãªã¹ã±ãŒã©ãã«ãªã³ãŒãããŒã¹ã®ãªãã¡ã¯ã¿ãªã³ã°ããã®å°è±¡ã¯ãŸã ããŸãè¯ããããŸããã ããã«ãå€ãã®ãªãœãŒã¹ãšãéãå¿ èŠã«ãªãå ŽåããããŸãã çæ³çã«ã¯ãã¢ããªã±ãŒã·ã§ã³ã¯å¿ èŠã«å¿ããŠæé·ããããã»ã¹ã§å€§ããªè²¡åã³ã¹ããå¿ èŠãšããªãã¯ãã§ãã
éå±€ã¢ãã«ãã¥ãŒã³ã³ãããŒã©ãã¿ãŒã³
![](https://habrastorage.org/storage/353a8d26/f5e04255/ad92b25f/8d6c76e3.png)
ãã¿ãŒã³éå±€ã¢ãã« - ãã¥ãŒ - ã³ã³ãããŒã©ïŒHMVCïŒç§ãã¡ã¯ãã§ã«æ¡åŒµæ§ãèšåããå€ãã®åé¡ã解決ããããšãã§ããŸãMVCã®æ¡åŒµãã§ãã ãªãã第1 JavaWorldããã°ãšããã¿ã€ãã«ã§2000幎7æã®èšäºã§èª¬æãããã¯ã©ã€ã¢ã³ãã¬ãã«ãéçºããããã®å€å±€ãã¿ãŒã³ïŒÂ«HMVC ã ãç¥èŠãããã¬ãŒã³ããŒã·ã§ã³ã¢ãã¹ãã©ã¯ã·ã§ã³ã»ã³ã³ãããŒã«ïŒPACïŒ - - 1987幎ã«èšèŒã®èè ã¯å®éã«ã¯ç°ãªããã¿ãŒã³ãèãçŽãããšã¯ã èšäºã®ç®çã¯ãHMVCã¯ãã¹ã±ãŒã©ãã«ãªWebãµã€ããäœæããã°ã©ãã£ã«ã«ãªã€ã³ã¿ãŒãã§ã€ã¹ãšãã¹ã¯ãããã¢ããªã±ãŒã·ã§ã³ã®èšèšã«ããããã«äœ¿çšããæ¹æ³ãå®èšŒããããšã§ããã
HMVCã¯ãåäžã®ã¢ããªã±ãŒã·ã§ã³ãšããŠæ©èœããåŸæ¥ã®MVCãã©ã€ã¢ãã®ã³ã¬ã¯ã·ã§ã³ã§ãã åãã©ã€ã¢ãã¯å®å šã«ç¬ç«ããŠãããä»ã®ãã©ã€ã¢ãããªãå Žåã«å®è¡ã§ããŸãã ãã¹ãŠã®ãã©ã€ã¢ããªã¯ãšã¹ãã¯ã³ã³ãããŒã©ãŒã€ã³ã¿ãŒãã§ã€ã¹ã䜿çšããå¿ èŠãããããã¡ã€ã³å€ã®ã¢ãã«ãã©ã€ãã©ãªãæ¥ç¶ããªãã§ãã ããã ãµãŒããŒäžã®ãã©ã€ã¢ãã®ç©ççãªå Žæã¯éèŠã§ã¯ãããŸãããäž»ãªããšã¯ãã·ã¹ãã ã®ä»ã®ãã¹ãŠã®éšåããã¢ã¯ã»ã¹ã§ããããšã§ãã HMVCã®ç¹åŸŽçãªæ©èœã¯ãã³ãŒãã®åå©çšãä¿é²ããã·ã¹ãã ã®åã ã®éšåã®ãã¹ããç°¡çŽ åããã¢ããªã±ãŒã·ã§ã³ãããã»ã©è€éã«ããããšãªãè€éã«æ¡åŒµã§ããããã«ããããšã§ãã
HMVCãã¿ãŒã³ã«åºã¥ããã¢ããªã±ãŒã·ã§ã³èšèšãæåãããã«ã¯ããã®æ©èœãåå¥ã®ã·ã¹ãã ã«åå²ããå¿ èŠããããŸãã åãã®ãããªã·ã¹ãã ã¯ãç¬ç«ããŠå¶åŸ¡æ段ã®ãšHMVCã¢ããªã±ãŒã·ã§ã³å ã®å€§ããªè¡šçŸãæ ŒçŽããäžãã©ã€ã¢ãMVCã§ããã¹ãã§ãã çŸåšãè¿œå ã¢ãžã¥ãŒã«ãªãã§HMVCããµããŒããããã¬ãŒã ã¯ãŒã¯ãããã€ããããŸãã ãããã®1ã€ã¯ãããšããšHMVCã«çŠç¹ãåœãŠãŠäœæããã第3ããŒãžã§ã³ã®Kohana PHPã§ã ã ããã«ãã¹ãŠã®äŸã§ããã®ãã¬ãŒã ã¯ãŒã¯ã䜿çšããŸãã
Kohana 3ã¯ãçµã¿èŸŒã¿ã®Requestãªããžã§ã¯ãã䜿çšããŠä»ã®ã³ã³ãããŒã©ãŒãåŒã³åºããŸãã èŠæ±ã¯ãã¢ããªã±ãŒã·ã§ã³ã³ã³ãããŒã©ãŒã«å¯Ÿããå éšãšWebãµãŒãã¹ã«å¯Ÿããå€éšã®äž¡æ¹ã«ããããšãã§ããŸãã ã©ã¡ãã®å Žåããåããªã¯ãšã¹ãã¯ã©ã¹ã䜿çšãããŸãã MVCãã©ã€ã¢ããå¥ã®ãµãŒããŒã«ç§»åããå Žåã1ã€ã®ãã©ã¡ãŒã¿ãŒã®ã¿ãå€æŽããå¿ èŠããããŸãã
<?php class Controller_Default extends Controller { public function action_index() { // $internal_request = Request::factory('controller/action/param') ->execute(); // $external_request = Request::factory('http://www.ibuildings.com/controller/action/param') ->execute(); } }
å éšãªã¯ãšã¹ãã«ã¯ãã³ã³ãããŒã©ãŒãšã¢ã¯ã·ã§ã³ãå«ãæ£ãããã¹ãå¿ èŠã§ããå€éšãªãœãŒã¹ãžã®ãªã¯ãšã¹ããäœæãããšãå®å šãªURLãæäŸãããŸãã ãã®æ©èœã«ãããå éšã¯ãšãªãšå€éšã¯ãšãªãè€éã«ããããšãªã亀æã§ãããããã¡ã€ã³ãµãŒããŒã®å€éšã§ãã©ã€ã¢ããååŸããã®ã¯éåžžã«ç°¡åãªã¿ã¹ã¯ã§ãã
Kohanaã®Requestã¯ã©ã¹ã䜿çšããŠå éšã³ã³ãããŒã©ãŒããããŒã¿ãååŸãããšãZend Frameworkãªã©ã®ä»ã®ãã¬ãŒã ã¯ãŒã¯ã§ã¢ã¯ã·ã§ã³ããªãã€ã¬ã¯ãããããšãæãåºãããå ŽåããããŸãã å®éããããã¯ãŸã£ããç°ãªã2ã€ã®æ¹æ³ã§ãã Kohanaã®ãªã¯ãšã¹ããªããžã§ã¯ãã¯ãäžæã®ãªã¯ãšã¹ããšããŠåç¬ã§åäœããã¢ã¯ã·ã§ã³ããªãã€ã¬ã¯ãããå Žåãäœæããããªã¯ãšã¹ãå ã«ããããååšããŸãã 以äžã¯ãããã瀺ãäŸã§ãã
ããã©ã«ãã®ã³ã³ãããŒã©ãŒ-/ application/ controllers/ default.php
<?php // class Controller_Default extends Controller { public function action_index() { // GET if ($this->request->method === 'GET') { // POST, array (0) { empty } var_dump($_POST); // $log = Request::factory('/log/access/'.$page_id); // POST $log->method = 'POST'; // - $log->post = array( 'uid' => $this->user->id, 'ua' => Request::user_agent('browser'), 'protocol' => Request::$protocol, ); // $log->execute(); // POST, array (0) { empty } var_dump($_POST); } } }
ãã°ã³ã³ãããŒã©ãŒ-/ application/ controllers/ log.php
<?php // class Controller_Log extends Controller { public function action_access($page_id) { // index ( ) // // array(3){string (3) 'uid' => int (1) 1, string (2) 'ua' => string(10) 'Mozilla... var_dump($_POST); // Log $log = new Log_Model; // $log->set_values($_POST) ->save(); } }
äžèšã®äŸã¯ãRequestãªããžã§ã¯ãã§å©çšå¯èœãªç¬ç«æ§ã瀺ããŠããŸãã æåã«ãGETãªã¯ãšã¹ããããã©ã«ãã³ã³ãããŒã©ãŒã®ã€ã³ããã¯ã¹ã¢ã¯ã·ã§ã³ãåŒã³åºããããã«å¿çããŠããã°ã³ã³ãããŒã©ãŒã®ã¢ã¯ã»ã¹ã¢ã¯ã·ã§ã³çšã®POSTãªã¯ãšã¹ããäœæãããŸãã ã€ã³ããã¯ã¹ã¢ã¯ã·ã§ã³ã¯ãæåã®ã³ã³ãããŒã©ãŒããã°ããŒãã«
$_POST
é åã«ã¢ã¯ã»ã¹ã§ããªã3ã€ã®å€æ°ã«å€ãå²ãåœãŠãŸãã 2çªç®ã®èŠæ±ãå®è¡ããããšãã
$_POST
æ¢ã«å©çšå¯èœãªå€æ°ãå«ãŸããŠããŸãã Index
$log->execute()
ã§
$log->execute()
ãå®äºãããšã
$_POST
ããŒã¿ãæ¶ããããšã«æ³šæããŠãã ããã ä»ã®ãã¬ãŒã ã¯ãŒã¯ã§ã¯ããã®çžäºäœçšã®å®è£ ã«ã¯ãCurlãªã©ã䜿çšããæ°ããã¯ãšãªã®äœæãå¿ èŠã§ãã
Gazouillementããã€ã¯ãããã°ãµãŒãã¹
GazouillementãšåŒã°ããæ¶ç©ºã®ã·ã§ãŒãã¡ãã»ãŒãžãµãŒãã¹ïŒã¹ããŒã¿ã¹ïŒã¯ãæ¬è³ªçã«Twitterã®é¡äŒŒç©ã§ãããHMVCã®åã瀺ãã®ã«åœ¹ç«ã¡ãŸãã Webã€ã³ã¿ãŒãã§ãŒã¹ãšã¡ãã»ãŒãžã³ã°ããã³é¢ä¿ã³ã³ããŒãã³ããåé¢ãããããã«ããµãŒãã¹æåã¢ãŒããã¯ãã£ãŒïŒSOAïŒã«åºã¥ããŠèšèšããããšããŸãã
![](https://habrastorage.org/storage/526881e2/c4a3716d/0d2db202/3f683543.png)
ãµãŒãã¹ã¯æ°ããã人ã ã¯ãŸã ããã«ã€ããŠç¥ããªãã®ã§ãæåã¯ããã©ãã£ãã¯ã¯æ¯èŒçå°ãããªããŸãã ãããã£ãŠãä»ã®ãšãããã¹ãŠã®ã¢ããªã±ãŒã·ã§ã³ããžãã¯ã1ã€ã®ãµãŒããŒã§å®è¡ãããå Žåãäœãæªãããšã¯èµ·ãããŸããã
ãŠãŒã¶ãŒã®ããŒã ããŒãžã衚瀺ããã³ã³ãããŒã©ãŒãäœæããŸãããã ææ°ã®ã¹ããŒã¿ã¹ãšããŠãŒã¶ãŒããã©ããŒããŠãããŠãŒã¶ãŒã®ãªã¹ãã衚瀺ãããŸãã
ã€ã³ããã¯ã¹ã³ã³ãããŒã©ãŒ-/ application/ controllers/ index.php
<?php // http://gazouillement.com/samsoir/ class Controller_Index extends Controller { public function action_index() { // (samsoir) $user = new Model_User($this->request->param('user')); // , 404 if ( ! $user->loaded) throw new Controller_Exception_404('Unable to load user :user', array(':user' => $this->request->param('user'))); // xhtml $messages = Request::factory('messages/find/'.$user->name.'.xhtml') ->execute() ->response; // xhtml $relations = Request::factory($user->name.'/following.xhtml') ->execute() ->response; // // , $this->request->response = View::factory('user/home', array( 'user' => $user, 'messages' => $messages, 'relations' => $relations, )); } }
ããã§ã¯ã
Controller_Index::action_index()
æ©èœãèŠãŠã¿ãŸãããã æåã«ãã¢ã¯ã·ã§ã³ã¯URLã®ãŠãŒã¶ãŒãã©ã¡ãŒã¿ãŒã«åºã¥ããŠãŠãŒã¶ãŒãããŒãããããšããŸãã ãããæåããªãå Žåã404ããŒãžã衚瀺ãããxhtml圢åŒã§ã¡ãã»ãŒãžãåä¿¡ããããã«ããªã¯ãšã¹ãURIã®å¯Ÿå¿ããã¯ã©ã¹ããããã£ããã®ãŠãŒã¶ãŒåã䜿çšããæ°ãããªã¯ãšã¹ããäœæãããŸãã åæ§ã«ãåã圢åŒã§ããŠãŒã¶ãŒé¢ä¿ãèŠæ±ãããŸãã ãã®çµæãViewã¯ã©ã¹ã®ãªããžã§ã¯ãã¯ããŠãŒã¶ãŒããã®ã¡ãã»ãŒãžãããã³ããã«é¢é£ä»ãããããªã¬ãŒã·ã§ã³ã§äœæãããŸãã
æ°ãããªã¯ãšã¹ããä»ããŠæ¢åã®ã¡ãã»ãŒãžãšé¢ä¿ãããŒãããå ŽåãåãµãŒãã¹ã®ã¢ããªã±ãŒã·ã§ã³ããžãã¯å šäœãWebãµã€ãããæœè±¡åããããŸãŸã«ãªããŸãã ãã®ã¢ãŒããã¯ãã£ã«ã¯ãéåžžã®ã³ã³ãããŒã©ãŒã®å®è¡ã«æ¯ã¹ãŠ2ã€ã®éèŠãªå©ç¹ããããŸãã
- ã³ã³ãããŒã©ã¯ãã¡ãã»ãŒãžãµãŒãã¹ããžãã¯ã®ã©ã®éšåã®åœ±é¿ãåããŸããã å¯äžã®èŠä»¶ã¯ãçµæãxhtml圢åŒã§ãªããã°ãªããªãããšã§ãã å®è¡æã«ãè¿œå ã®ã©ã€ãã©ãªãŸãã¯æ¡åŒµæ©èœã¯ããŒããããŸããã§ããã
- åã³ã³ãããŒã©ãŒã¯ç¹å®ã®ã¿ã¹ã¯ã1ã€ã ãæ åœããããããŠããããã¹ãã®èšè¿°ãå€§å¹ ã«ç°¡çŽ åãããŸãã
ä»ç€ºããæœè±¡åã®ã¬ãã«ã®ããããµãŒãã¹ãäœãããŠããããèŠãã®ã¯äžå¯èœã§ãã ãããã£ãŠãã¡ãã»ãŒãžãµãŒãã¹ã³ã³ãããŒã©ãŒã«æ³šç®ããŸãããã ã¡ãã»ãŒãžãªã¯ãšã¹ãã®å éšç®¡çãæ åœããããŒããã¡ã€ã«ã®ã«ãŒãããå§ããŸãããã Kohanaã®Routeã¯ã©ã¹ã¯ãæž¡ãããURIèŠçŽ ãã³ã³ãããŒã©ãŒãã¢ã¯ã·ã§ã³ãããã³ãã©ã¡ãŒã¿ãŒã«é¢é£ä»ããããšã«ãããå éšURLã解æããŸãã
ã«ãŒãèšå®-/ application/bootstrap.php
Route::set('messages', 'messages/<action>/<user>(<format>)', array('format' => '\.\w+')) ->defaults(array( 'format' => '.json', 'controller' => 'messages', ));
ããã«ãããã¡ãã»ãŒãžã³ã°ãµãŒãã¹ã®ã«ãŒããäœæãããŸããããã¯ããããŸã§ã®ãšããã¡ã€ã³ã¢ããªã±ãŒã·ã§ã³ã®ãã¡ã€ã³å ã«ãããŸãã ã¢ãã¬ã¹messages / find / samsoir.xhtmlãä»ãããªã¯ãšã¹ãã¯ã¡ãã»ãŒãžã³ã³ãããŒã©ãŒã«ãªãã€ã¬ã¯ãããããã®
find()
ã¢ã¯ã·ã§ã³ã¯ãã©ã¡ãŒã¿ãŒ
'user' => 'samsoir'
ããã³
'format => '.json'
ãŸãã
ã¡ãã»ãŒãžã³ã³ãããŒã©ãŒ-/ application/ controllers/ messages.php
<?php class Controller_Messages extends Controller { // , protected $supported_formats = array( '.xhtml', '.json', '.xml', '.rss', ); // protected $user; // // public function before() { // if ( ! in_array($this->request->param('format'), $this->supported_formats)) throw new Controller_Exception_404('File not found'); // $this->user = new Model_User($this->request->param('user')); if ( ! $this->user->loaded()) throw new Controller_Exception_404('File not found'); return parent::before(); } // public function find() { // 1:M $messages = $this->user->messages; // , prepare $this->request->response = $this->_prepare_response($messages); } // protected function _prepare_response(Model_Iterator $messages) { // , switch ($this->request->param('format') { case '.json' : { $this->request->headers['Content-Type'] = 'application/json'; $messages = $messages->as_array(); return json_encode($messages); } case '.xhtml' : { return View::factory('messages/xhtml', $messages); } default : { throw new Controller_Exception_404('File not found!'); } } } }
ãŠãŒã¶ãŒã¡ãã»ãŒãžã詳现ã«åä¿¡ããããã»ã¹ã¯ã
Controller_Messages
瀺ãããŠã
Controller_Messages
ã ãã¹ãŠã®ã¡ãœãããšããããã£ã¯ããŠãŒã¶ãŒé¢ä¿ãå«ãã¡ãã»ãŒãžã³ã³ããã¹ãã«ã®ã¿ãã€ã³ããããŸãã ãã®ã³ã³ãããŒã©ãŒã®ã³ãŒããèŠãŠãäœãèµ·ãã£ãŠããã®ããç解ããŸãããã
Requestãªããžã§ã¯ãã¯ãæå®ãããã¢ã¯ã·ã§ã³ãåŒã³åºã
before()
ã«ãåžžã«
before()
ã¡ãœãã
before()
åŒã³åºããŸãã ããã«ãããã¡ã€ã³äœæ¥ã®åã«ããŸããŸãªã«ãŒãã³æäœãå®è¡ã§ããŸãã
before()
ã¡ãœããã¯æåã«èŠæ±ããã圢åŒã®ãµããŒãããã§ãã¯ãã次ã«ãŠãŒã¶ãŒåã®æ£åœæ§ããã§ãã¯ããŸãã
before()
ãäŸå€ãã¹ããŒããã«çµäºããå ŽåãRequestãªããžã§ã¯ãã¯
find()
ã¢ã¯ã·ã§ã³ãåŒã³åºã
find()
ã ãŠãŒã¶ãŒã¡ãã»ãŒãžãModel_Iteratorãªããžã§ã¯ããšããŠèªã¿èŸŒã¿ãŸãã ãŠãŒã¶ãŒé¢ä¿ã«ã¡ãã»ãŒãžãèŠã€ãããªãå Žåãã€ãã¬ãŒã¿ãŒã¯ç©ºã«ãªãããšã«æ³šæããŠãã ããã æåŸã«ãã¡ãã»ãŒãžã€ãã¬ãŒã¿ã
_prepare_response()
ã¡ãœããã«
_prepare_response()
ãŸãããã®ã¡ãœããã¯ãåºåçšã®ããŒã¿ãæ£ãããã©ãŒãããããå¿ èŠãªãã¹ãŠã®ããããŒãèšå®ããŸãã
ã³ã³ãããŒã©ãŒ
Controller_Index
ãš
Controller_Messages
ã¯äž¡æ¹ãšããåäžã®ã¢ããªã±ãŒã·ã§ã³èŠæ±ã«ãã£ãŠå®è¡ãããŸããã ããã«ããããããã圌ãã¯ãäºãã®ååšãç¥ããªãã£ãã åéçºè ã¯ãçŸåšã®ã³ãŒãããŒã¹ãèªãã§ãäœãã©ãã§å®è¡ãããŠããããç解ã§ããŸãã ããã¯HMVCã®ãã1ã€ã®åªããæ©èœã§ãããã¡ã³ããã³ã¹ã容æã§ãã
æ®ãã®ãµãŒãã¹ã®ã³ãŒãã®äœæ¥ãçµããåŸãäŒæ¥å¹¹éšã¯éçºã®ç¬¬1段éã«æºè¶³ãè¡šæããéå®çãªããŒã¿ãã¹ãã®ããã«ãªãŒãã³ãµãŒããŒã§ã®å±éãèš±å¯ããŸããã æ°é±éåŸãã¢ããªã±ãŒã·ã§ã³ã¯å€§é䜿çšã®æºåãæŽããŸãã ä»åŸæ°ãæã«ããã£ãŠãèŠèŽè ã¯çµ¶ããæé·ãããµã€ãã®ã¢ãŒããã¯ãã£å šäœãæ¹åããã³æé©åãããŸãã
ã¹ãã£ãŒãã³ãã©ã€å¹æ
Stephen FryïŒ @stephenfry ïŒã¯ã200äžäººãè¶ ãããã©ãã¯ãŒãæã€æãæåãªTwitterãŠãŒã¶ãŒã®1人ã§ãã 圌ã¯èªåã®ãã€ã¯ãããã°ã«URLãå ¬éããã ãã§ãµã€ããç¡å¹ã«ãããµãŒããŒã«DDOSæ»æãä»æããããšãã§ããŸãã
Gazouillementã¯éå»æ°ãæéãç©æ¥µçã«ãŠãŒã¶ãŒãåéããŠããŸãã ããã«ããå¿çæéãå¢å ããŸãããããŸã 蚱容ç¯å²å ã§ãã çªç¶ãStephen Fryã®ãããªèšå€§ãªæ°ã®ãã©ãã¯ãŒãæã€TwitterãŠãŒã¶ãŒãGazouillementãžã®ãªã³ã¯ãæçš¿ããŠããŸã ã ãããŠããµãŒãã¹ã«ã¯å®éã®åé¡ãçãå§ããŸãã
æåã¯å€§éã®ãã©ãã£ãã¯ã«ãªããŸãã 1ç§ãããéåžžã®æ°çŸã®ãªã¯ãšã¹ãã®ä»£ããã«ãã¢ããªã±ãŒã·ã§ã³ã¯æ°åãåŠçããå¿ èŠããããŸãã ãã®ã·ããªãªã§ã¯ã Gazouillementã¯èŒ»èŒ³ãçµéšãå§ãããµãŒããŒãã眮ããå¯èœæ§ããããŸãã èããå¢å ãããã©ãã£ãã¯ã«å¯ŸåŠããã«ã¯ãã¢ããªã±ãŒã·ã§ã³ã«æé©åãšæ¹åãå¿ èŠã§ããããšãæããã«ãªããŸãã
ã³ãŒããåæããŠããã©ãŒãã³ã¹ãæ¹åããã®ã¯ç°¡åãªããšã§ã¯ãããŸããã 以åã® TechPortalã® èšäºã§ 㯠ãå®è¡æã®ã¡ã¢ãªãšããã»ããµã®è©³çŽ°ãªåæã®ããã«èšèšãããXHProfãªã©ã®ãŠãŒãã£ãªãã£ãåãäžããŸãã ã Kohana PHPã«ã¯ãProfilerãšåŒã°ããã«ãŒãã«ããã©ãŒãã³ã¹åæããã°ã©ã ãçµã¿èŸŒãŸããŠããŸãã ãã ãã XHProfããã³åæ§ã®ãŠãŒãã£ãªãã£ã®ä»£æ¿ã§ã¯ãªã ãè£å®çãªãã®ã§ãã ãããã¡ã€ã©ãŒã䜿çšãããšãéçºè ã¯å®è¡å¯èœã³ãŒãå ã®é ãå Žæãæ€åºã§ããXHProfãŸãã¯ãã¬ãŒã ã¯ãŒã¯ã«çµã¿èŸŒãŸããå¥ã®ã¢ãžã¥ãŒã«Codebenchã䜿çšããŠè©³çŽ°ã«èª¿ã¹ãããšãã§ããŸãã
ããŒãããŒããŒã§ãã©ã¡ãŒã¿ãŒã1ã€ã ãå€æŽããããšã§ããããã¡ã€ã©ãŒãæå¹ã«ã§ããŸãã
ããŒããŒ-/ application/bootstrap.php
//-- Environment setup -------------------------------------------------------- Kohana::$profiling = TRUE;
æåŸã«ãã³ã³ãããŒã©ãŒã®å¿çã®æåŸã«ãããã¡ã€ã©ãŒãã¥ãŒãè¿œå ããŸãã ããã¯
after()
ã¡ãœããã䜿çšããŠè¡ãã®ãæé©ã§ããã¹ãŠã®ã¢ã¯ã·ã§ã³ã«å¯ŸããŠãããã¡ã€ã©ãŒã衚瀺ãããŸãã
ã€ã³ããã¯ã¹ã³ã³ãããŒã©ãŒ-/ application/ controllers/ index.php
public function after() { // $this->request->response .= View::factory('profiler/stats'); }
ãããã¡ã€ã©ãŒããªã³ã«ãããšããã®ã³ã³ãããŒã©ãŒããã®åã¢ã¯ã·ã§ã³ã®äžéšã«ãã®æ å ±ã衚瀺ããå§ããŸãã Controllerãç¶æ¿ããã¯ã©ã¹ãäœæãããããã¡ã€ã©ãŒãã¥ãŒããã®ã¯ã©ã¹ã®
after()
ã¡ãœããã«æ¿å ¥ããããšããå§ãããŸãã çŸåšããã¹ãŠã®ã·ã¹ãã ã³ã³ãããŒã©ãŒã¯ãéçºäžã«ãããã¡ã€ã©ãŒã®ãããã°æ å ±ã衚瀺ããŸãã
![](https://habrastorage.org/storage/8cf5989e/76b189c7/93d63d04/75623e58.png)
ãããã¡ã€ã©ãŒã¯ããã¬ãŒã ã¯ãŒã¯ã®äœæ¥ã«ã€ããŠã¬ããŒãããããŸããŸãªã³ã³ããã¹ãïŒåæåãã¯ãšãªãããŒã¿ããŒã¹ãžã®ã¢ã¯ã»ã¹ãªã©ïŒãã°ã«ãŒãåãã察å¿ããããã»ããµãŒæéãšå²ãåœãŠãããã¡ã¢ãªãŒã®éã衚瀺ããŸãã äœæãããåãªã¯ãšã¹ãã®åã«ããæ å ±ãèŠããšãæéããããããããªã¯ãšã¹ããèšç®ããæ¹ãã¯ããã«ç°¡åã§ãã ãããçºçããå ŽåãXHProfãªã©ã®ãŠãŒãã£ãªãã£ã䜿çšããŠããã詳现ãªåæãè¡ãããšãã§ããŸãã
Gazouillementã®ã¹ã±ãŒãªã³ã°
Gazouillementã®ã°ããŒãã«ããã©ãŒãã³ã¹åæ㯠ãã¡ãã»ãŒãžã®åä¿¡ãéåžžã«é£ããããšã瀺ããŠããŸãã éçºããŒã ã¯å¯Ÿå¿ããMVCãã©ã€ã¢ãããªãã¡ã¯ã¿ãªã³ã°ããã³æé©åããŸããããç®çã®ããã©ãŒãã³ã¹ã¡ããªãã¯ãåŸãããããšã¯ãããŸããã§ããã ãµãŒããŒã®ããã»ããµãšã¡ã¢ãªãç¹ã«çç£çã«æ¹åããªãã£ãåŸãäŒæ¥ã®å¹¹éšã¯ã¡ãã»ãŒãžã³ã°ã·ã¹ãã ããå§ããŠãã¢ããªã±ãŒã·ã§ã³ãæ°Žå¹³æ¹åã«æ¡åŒµããããšã«åæããŸãã
MVCã¢ãŒããã¯ãã£ã§ã¯ãéåžžãæ°ãããµãŒãã¹ã¯èšèšãéçºãåãå ¥ããã¹ããå®è£ ã®æ®µéãçµãå¿ èŠããããŸãã ãã®ããã»ã¹ã«ã¯æ°ãæãããããšããããå€å€§ãªæè³ãå¿ èŠã§ãã ãããå®éã«ã¯ã Gazouillementã§ã¯ãæ°ããããã°ã©ã ã§ã¯ãªããæ°ãããœãããŠã§ã¢ãçµ±åãããŸãã
HMVCã«åºã¥ãã¢ããªã±ãŒã·ã§ã³ã§ã¯ãæ¢åã®ã³ãŒãããŒã¹ã«åºã¥ãæ°ãããµãŒãã¹ãæçæéã§äœæã§ããŸãã ã¡ãã»ãŒãžãµãŒãã¹ãšã®ãã¹ãŠã®å¯Ÿè©±ã¯ã¡ã€ã³ã³ã³ãããŒã©ãŒãä»ããŠå®è¡ããããããã¡ãã»ãŒãžèŠæ±ã®ã¿ãå€æŽããå¿ èŠããããŸãã
ã¡ãã»ãŒãžã³ã°ãµãŒãã¹ã¯å¥ã®ãµãŒããŒã«ç§»åãããããŒã¿ããŒã¹ãæäœããããã«æé©åãããŸããã ãã®æ°ãããµãŒããŒã¯ã¡ãã»ãŒãžã³ã°é¢é£ã®ã¢ã¯ã·ã§ã³ã®ã¿ãå®è¡ããããããã®ãããªãã¹ãŠã®æäœã®é床ãå€§å¹ ã«åäžããŸãã
ã€ã³ããã¯ã¹ã³ã³ãããŒã©ãŒ-/ application/ controllers/ index.php
<?php // http://gazouillement.com/samsoir/ class Controller_Index extends Controller { protected $_messages_uri = 'http://messages.gazouillement.com'; public function action_index() { // (samsoir) $user = new Model_User($this->request->param('user')); // , 404 if ( ! $user->loaded) throw new Controller_Exception_404('Unable to load user :user', array(':user' => $this->request->param('user'))); // -- -- // URI $messages_uri = $this->_messages_uri.'/find/'.$user->name'.xhtml'; // xhtml $messages = Request::factory($messages_uri) ->execute() ->response; // -- -- // xhtml $relations = Request::factory($user->name.'/following.xhtml') ->execute() ->response; // // , $this->request->response = View::factory('user/home', array( 'user' => $user, 'messages' => $messages, 'relations' => $relations, )); } }
ã³ãŒãã§ã¯ãã³ã³ãããŒã©ãŒ
Controller_Index::action_index()
ã§å°ããªå€æŽã匷調衚瀺ãããŠã
Controller_Index::action_index()
ã ã¡ãã»ãŒãžãªã¯ãšã¹ãã¯ãå éšã³ã³ãããŒã©ãŒã®ã¢ã¯ã·ã§ã³ã§ã¯ãªãã messages.gazouillement.comãµããã¡ã€ã³ã§å®è¡ãããã¡ãã»ãŒãžãµãŒãã¹ã«éä¿¡ãããããã«ãªããŸããã éåžžããããžã§ã¯ãã®ã¢ãŒããã¯ãã£å šäœã®ã¬ãã¥ãŒã«ã€ãªãããã®ã¯ãå°ããªè¿œå ã«ãªããŸããã ãŸããã³ãŒãã¯ã»ãšãã©å€æŽãããŠããªããããé¢é£æ§ãã¹ããšåãå ¥ããã¹ãã¯å€§å¹ ã«ççž®ãããŸãã
ããã¯ãHierarchical-Model-View-Controllerãã¿ãŒã³ã䜿çšããŠãéçºè ãæåããåçŽããã³æ°Žå¹³ã«æ¡åŒµã§ããWebã¢ããªã±ãŒã·ã§ã³ãèšèšããæ¹æ³ã®ã»ãã®äžäŸã§ãã Requestãªããžã§ã¯ãã䜿çšãããšãã³ã³ãããŒã©ãŒãã·ã³ãã«ãªã€ã³ã¿ãŒãã§ã€ã¹ã䜿çšããŠåã³ã³ããã¹ãã®æ£ããããŒã¿ãè¿ãããšãã§ããŸãã ãµãŒããŒå€ã®ã¢ããªã±ãŒã·ã§ã³ã®äžéšãåé€ããã®ãéåžžã«ç°¡åãªæ¹æ³ã§ããããšãããããŸããã ãŸããã¹ã±ãŒãªã³ã°ã®ã³ã¹ãã¯ãå°æ°ã®å€æŽã«ããæ¯èŒçäœãã£ããããäŒç€Ÿã®å¹¹éšã¯éåžžã«æºè¶³ããŠããŸããã
Kohanaã®è©³çŽ°ã«ã€ããŠã¯ããã¬ãŒã ã¯ãŒã¯ã®Webãµã€ããåç §ããŠãã ãããKohanaPHP 3ãã¡ã€ã«ã¯GithubããããŠã³ããŒãã§ããŸãã ãŸã APIããã¥ã¡ã³ãããããŸãïŒ http : //v3.kohanaphp.com/guide
ãã®äŸã§äœ¿çšãããŠããã¯ãšãªã¯ã©ã¹ã¯ãçŸåšãå人ã®githubã¢ã«ãŠã³ãïŒ http://github.com/samsoir/coreïŒã®Kohanaã«ãŒãã«éçºãã©ã³ãã§å©çšã§ããŸã ã å ¬åŒKohana PHP 3.0ãã£ã¹ããªãã¥ãŒã·ã§ã³ã䜿çšããŠããå Žåãã¯ãšãªçšã®ä¿®æ£ãããã¯ã©ã¹æ¡åŒµãå¿ èŠã§ã ã