>백엔드 개발 >PHP 튜토리얼 >이것은 내 MVC 프레임워크 ActionController의 캡슐화입니다.

이것은 내 MVC 프레임워크 ActionController의 캡슐화입니다.

WBOY
WBOY원래의
2016-07-25 09:10:061032검색
내가 좋아하는 MVC의 ActionController가 무엇인가요?
  1. /*
  2. * MST_Library v3.1
  3. * @autohr Janpoem
  4. */
  5. if (!define('IN_MST_CORE'))
  6. exit('MST_ActionController는 단일을 포함할 수 없습니다!');
  7. if (!definated(MST_Core::LITE_MODE)) {
  8. MST_Core: :import(array(
  9. 'MST/ActionController/Request',
  10. 'MST/ActionController/Router',
  11. ), MST_Core::P_LIB);
  12. }
  13. 추상 클래스 MST_ActionController {
  14. const
  15. NO_RENDER = false,
  16. IS_RENDER = 'ControlLER_IS_RENDER',
  17. PF_CONTROLLER = '컨트롤러',
  18. PF_ACTION = '액션',
  19. FILE = '파일 ',
  20. VIEW = '보기',
  21. TEXT = '텍스트',
  22. ACTION = '액션',
  23. WIDGET = '위젯',
  24. CUSTOM_VIEW = 'custom_view';
  25. private static
  26. $_request = null,
  27. $_instance = null,
  28. $_currentView = null;
  29. # @todo 此处的处理应该放到controller被实例化以后, dispatch应该有一个具体含义
  30. final static public function dispatch(array $config = null, $beforeDispatch = null) {
  31. if (self::$_instance == null) {
  32. $request = new MST_ActionController_Request($config['request']);
  33. $router = new MST_ActionController_Router($config['routes']);
  34. $router->routing($request);
  35. $controller = $ request['controller'];
  36. $controller = MST_String::camelize2($controller) . static::PF_ControlLER;
  37. if ($request['module'] != null) {
  38. $module = $request['module'];
  39. if (strpos($module, '/') !== false)
  40. $module = str_replace('/', '_', $module);
  41. $controller = $module . '_' . $controller;
  42. }
  43. if (is_callable($beforeDispatch)) {
  44. call_user_func_array($beforeDispatch, array($request, & $controller));
  45. }
  46. $GLOBALS['DATA_CACHE ']['request'] = & $request;
  47. if (!class_exists($controller))
  48. MST_Core::error(202, $controller);
  49. else
  50. self::$_instance = new $controller();
  51. }
  52. }
  53. 공개
  54. $layout = false,
  55. $format = 'html',
  56. $params = null,
  57. $autoLoadHelper = false;
  58. protected
  59. $comet = 0,
  60. $viewPath = null,
  61. $defaultRender = self::VIEW;
  62. 추상 공용 함수 애플리케이션 ();
  63. 개인 함수 __construct()
  64. {
  65. if ($this->comet <= 0)
  66. ob_start();
  67. $this->params = & $GLOBALS['DATA_CACHE']['request'];
  68. $this->viewPath = Trim(
  69. $this->params['module'] . '/' . $this-> ;params['controller'], '/');
  70. if ($this->application() !== self::NO_RENDER)
  71. $this->action($this->params ['action']);
  72. }
  73. 공개 함수 __destruct() {
  74. if (!definated(self::IS_RENDER) && self::$_currentView != null) {
  75. 스위치 ($this->defaultRender) {
  76. 케이스 self::VIEW :
  77. 케이스 self::TEXT :
  78. 케이스 self::ACTION :
  79. 케이스 self::WIDGET :
  80. # $this->defaultRender = $mode;
  81. break;
  82. default :
  83. $this->defaultRender = self::VIEW;
  84. }
  85. $this->render(
  86. $this->defaultRender,
  87. self::$_currentView
  88. );
  89. }
  90. if (self::$_instance != null)
  91. self::$_instance = null ;
  92. if (self::$_request != null)
  93. self::$_request = null;
  94. }
  95. 보호 함수 작업($action) {
  96. $name = MST_String::camelize($action);
  97. $actName = $name . self::PF_ACTION;
  98. if (!method_exists($this, $actName))
  99. MST_Core::error(203, $actName);
  100. $actRef = new ReflectionMethod($this, $actName);
  101. if ($actRef->isPrivate() || $actRef->isProtected()
  102. && !constant(MST_ActionController_Router::IS_MAP))
  103. MST_Core::error(203, $actName);
  104. if ($this->$actName() !== self::NO_RENDER && self::$_currentView == null)
  105. self::$_currentView = $action;
  106. return $this;
  107. }
  108. /**
  109. * 출력, URL 점프
  110. */
  111. 보호 함수 리디렉션($url) {
  112. if (defed(self::IS_RENDER)) return self::NO_RENDER;
  113. 정의(self::IS_RENDER, true);
  114. header('Location:'.linkUri($url));
  115. return $this;
  116. }
  117. // XML 렌더링
  118. // JAVASCRIPT
  119. 보호 함수 렌더링(
  120. $mode = null,
  121. $content = null,
  122. array $options = null)
  123. {
  124. if (definition(self) ::IS_RENDER)) return self::NO_RENDER;
  125. 정의(self::IS_RENDER, true);
  126. if ($mode == null) $mode = $this->defaultRender;
  127. if ( $mode == self::VIEW)
  128. $content = $this->viewPath . '/' . $content;
  129. MST_ActionView::instance()
  130. ->할당($this)
  131. ->setOptions($options)
  132. ->render($mode, $content);
  133. $this를 반환하세요.
  134. }
  135. 보호 함수 customRender($file, $path, array $options = null) {
  136. return $this->render(self::CUSTOM_VIEW, array($file, $path), $options );
  137. }
  138. 보호 함수 setView($val) {
  139. self::$_currentView = $val;
  140. }
  141. 보호 함수 setViewOption($key, $ val) {
  142. MST_ActionView::instance()->setOption($key, $val);
  143. return $this;
  144. }
  145. 보호 함수 getViewOption($key) {
  146. return MST_ActionView::instance()->getOption($key);
  147. }
  148. 보호 함수 setViewOptions(array $options) {
  149. MST_ActionView::instance()->setOptions ($options);
  150. return $this;
  151. }
  152. 보호 함수 getViewOptions() {
  153. return MST_ActionView::instance()->getOptions();
  154. }
  155. 보호 함수 doComet(Closure $fn) {
  156. $times = 0;
  157. set_time_limit(0);
  158. while(true) {
  159. ob_flush();
  160. 플러시( );
  161. $times ;
  162. $result = call_user_func($fn, $times, $this);
  163. if ($result === false) {
  164. break;
  165. }
  166. usleep(10000);
  167. sleep($this->comet);
  168. }
  169. }
  170. }
复system代码


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.