yaf
yaf copied to clipboard
关于__call()
请问,我希望在访问某个controller时未找到方法时可以去__call,如何处理?谢谢!
call? controller是一个类, 你找不到类call谁呢? 解决方案, 在ErrorController里面, 捕获CONTROLLER_NOT_FOUND异常, 执行你想要的代码
可能我没说明白,比方说,默认路由下,我访问/abc/def abc这个controller是存在的,只是没有defAction,但是我希望不报错,而是去调用 php的 _call()方法(类似wordpress插件的实现方式)。
我在abc这个controller里直接$this->defAction()时如果defAction不存在的话是可以直接调用__call方法的,但是通过网址访问则不行。
public function __call($method, $args) { return do_action( $method , $args ); }
do_action是自己实现的一个函数。
hmm,明白了, 我想想, 目前肯定是不支持的
好……继续关注。谢谢
可以自己写路由. 在 2013-8-5 下午4:55,"Albert Lee" [email protected]写道:
好……继续关注。谢谢
— Reply to this email directly or view it on GitHubhttps://github.com/laruence/php-yaf/issues/50#issuecomment-22093967 .
有具体方案么?谢谢
thx
On Monday, August 5, 2013, lilj wrote:
之前写的, 你可以参考一下, 效率肯定不如鸟哥原生的, 你可以尝试一下继承他的一些路由? 我没试过.
request = $request; $uri = $request->getRequestUri(); $uri = preg_replace('/\/+/', '/', ltrim($uri, $request->getBaseUri())); $uri = preg_replace('/\?.*/', '', $uri); $uri = rtrim($uri, '/'); unset($_GET[$uri]); $this->params = $uri ? explode('/', $uri) : array(); $this->def = Yaf_Application::app()->getConfig()->application->dispatcher; $controller_prefix = $this->_findControllerPrefix(); $controller = $this->_findController($controller_prefix); $action = $this->_findAction($controller); $request->setControllerName($controller); $request->setActionName($action); $request->setRouted(TRUE); $request->setParam($this->params); return TRUE; } private function _findAction($controllerName){ if(isset($this->params[0])){ $action = strtolower($this->params[0]).YAF_SUFFIX_ACTION; if(method_exists($controllerName.YAF_SUFFIX_CONTROLLER, $action)){ return array_shift($this->params); } } return $this->defaultAction; } private function _findController($prefix){ if(isset($this->params[0])){ $controller = $prefix; $controller[] = ucwords($this->params[0]); $try_controller = implode('_', $controller); if($this->_isController($try_controller)){ array_shift($this->params); return $try_controller; } } $controller = $prefix; $controller[] = ucwords($this->defaultController); $try_controller = implode('_', $controller); if($this->_isController($try_controller)){ return $try_controller; } throw new Exception("Controller Not Found!"); } private function _findControllerPrefix(){ $controller_path = APP_PATH.'controllers'.DS; $prefix = array(); for($i = 0; $i params);){ $controller_path = $controller_path.ucwords($this->params[$i]).DS; if(is_dir($controller_path)){ $prefix[] = ucwords(array_shift($this->params)); continue; } break; } return $prefix; } private function _isController($controllerName){ return Yaf_Loader::getInstance()->autoload($controllerName.YAF_SUFFIX_CONTROLLER); } } ?>Thanks [email protected] <javascript:_e({}, 'cvml', '[email protected]');>
2013/8/5 Albert Lee <[email protected] <javascript:_e({}, 'cvml', '[email protected]');>>
有具体方案么?谢谢
— Reply to this email directly or view it on GitHub< https://github.com/laruence/php-yaf/issues/50#issuecomment-22094204> .
— Reply to this email directly or view it on GitHubhttps://github.com/laruence/php-yaf/issues/50#issuecomment-22094576 .
李博
我们是搞开发的
http://t.sina.com.cn/1749026125?s=6uyXnP