yaf icon indicating copy to clipboard operation
yaf copied to clipboard

关于__call()

Open leeeboo opened this issue 11 years ago • 10 comments

请问,我希望在访问某个controller时未找到方法时可以去__call,如何处理?谢谢!

leeeboo avatar Aug 05 '13 06:08 leeeboo

call? controller是一个类, 你找不到类call谁呢? 解决方案, 在ErrorController里面, 捕获CONTROLLER_NOT_FOUND异常, 执行你想要的代码

laruence avatar Aug 05 '13 06:08 laruence

可能我没说明白,比方说,默认路由下,我访问/abc/def abc这个controller是存在的,只是没有defAction,但是我希望不报错,而是去调用 php的 _call()方法(类似wordpress插件的实现方式)。

leeeboo avatar Aug 05 '13 06:08 leeeboo

我在abc这个controller里直接$this->defAction()时如果defAction不存在的话是可以直接调用__call方法的,但是通过网址访问则不行。

leeeboo avatar Aug 05 '13 06:08 leeeboo

public function __call($method, $args) { return do_action( $method , $args ); }

do_action是自己实现的一个函数。

leeeboo avatar Aug 05 '13 06:08 leeeboo

hmm,明白了, 我想想, 目前肯定是不支持的

laruence avatar Aug 05 '13 08:08 laruence

好……继续关注。谢谢

leeeboo avatar Aug 05 '13 08:08 leeeboo

可以自己写路由. 在 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 .

lilj avatar Aug 05 '13 08:08 lilj

有具体方案么?谢谢

leeeboo avatar Aug 05 '13 08:08 leeeboo


lilj avatar Aug 05 '13 09:08 lilj

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

leeeboo avatar Aug 05 '13 11:08 leeeboo