Dispatcher.php 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. <?php
  2. /**
  3. * MINZ - Copyright 2011 Marien Fressinaud
  4. * Sous licence AGPL3 <http://www.gnu.org/licenses/>
  5. */
  6. /**
  7. * Le Dispatcher s'occupe d'initialiser le Controller et d'executer l'action
  8. * déterminée dans la Request
  9. * C'est un singleton
  10. */
  11. class Minz_Dispatcher {
  12. const CONTROLLERS_PATH_NAME = '/Controllers';
  13. /* singleton */
  14. private static $instance = null;
  15. private static $needsReset;
  16. private $router;
  17. private $controller;
  18. /**
  19. * Récupère l'instance du Dispatcher
  20. */
  21. public static function getInstance ($router) {
  22. if (self::$instance === null) {
  23. self::$instance = new Minz_Dispatcher ($router);
  24. }
  25. return self::$instance;
  26. }
  27. /**
  28. * Constructeur
  29. */
  30. private function __construct ($router) {
  31. $this->router = $router;
  32. }
  33. /**
  34. * Lance le controller indiqué dans Request
  35. * Remplit le body de Response à partir de la Vue
  36. * @exception Minz_Exception
  37. */
  38. public function run () {
  39. do {
  40. self::$needsReset = false;
  41. try {
  42. $this->createController ('FreshRSS_' . Minz_Request::controllerName () . '_Controller');
  43. $this->controller->init ();
  44. $this->controller->firstAction ();
  45. if (!self::$needsReset) {
  46. $this->launchAction (
  47. Minz_Request::actionName ()
  48. . 'Action'
  49. );
  50. }
  51. $this->controller->lastAction ();
  52. if (!self::$needsReset) {
  53. echo $this->controller->view ()->build ();
  54. }
  55. } catch (Minz_Exception $e) {
  56. throw $e;
  57. }
  58. } while (self::$needsReset);
  59. }
  60. /**
  61. * Informe le contrôleur qu'il doit recommancer car la requête a été modifiée
  62. */
  63. public static function reset() {
  64. self::$needsReset = true;
  65. }
  66. /**
  67. * Instancie le Controller
  68. * @param $controller_name le nom du controller à instancier
  69. * @exception ControllerNotExistException le controller n'existe pas
  70. * @exception ControllerNotActionControllerException controller n'est
  71. * > pas une instance de ActionController
  72. */
  73. private function createController ($controller_name) {
  74. $filename = APP_PATH . self::CONTROLLERS_PATH_NAME . '/'
  75. . $controller_name . '.php';
  76. if (!class_exists ($controller_name)) {
  77. throw new Minz_ControllerNotExistException (
  78. $controller_name,
  79. Minz_Exception::ERROR
  80. );
  81. }
  82. $this->controller = new $controller_name ($this->router);
  83. if (! ($this->controller instanceof Minz_ActionController)) {
  84. throw new Minz_ControllerNotActionControllerException (
  85. $controller_name,
  86. Minz_Exception::ERROR
  87. );
  88. }
  89. }
  90. /**
  91. * Lance l'action sur le controller du dispatcher
  92. * @param $action_name le nom de l'action
  93. * @exception ActionException si on ne peut pas exécuter l'action sur
  94. * le controller
  95. */
  96. private function launchAction ($action_name) {
  97. if (!is_callable (array (
  98. $this->controller,
  99. $action_name
  100. ))) {
  101. throw new Minz_ActionException (
  102. get_class ($this->controller),
  103. $action_name,
  104. Minz_Exception::ERROR
  105. );
  106. }
  107. call_user_func (array (
  108. $this->controller,
  109. $action_name
  110. ));
  111. }
  112. }