Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

关于__call() #50

Open
leeeboo opened this issue Aug 5, 2013 · 10 comments
Open

关于__call() #50

leeeboo opened this issue Aug 5, 2013 · 10 comments

Comments

@leeeboo
Copy link

leeeboo commented Aug 5, 2013

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

@laruence
Copy link
Owner

laruence commented Aug 5, 2013

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

@leeeboo
Copy link
Author

leeeboo commented Aug 5, 2013

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

@leeeboo
Copy link
Author

leeeboo commented Aug 5, 2013

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

@leeeboo
Copy link
Author

leeeboo commented Aug 5, 2013

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

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

@laruence
Copy link
Owner

laruence commented Aug 5, 2013

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

@leeeboo
Copy link
Author

leeeboo commented Aug 5, 2013

好……继续关注。谢谢

@lilj
Copy link

lilj commented Aug 5, 2013

可以自己写路由.
在 2013-8-5 下午4:55,"Albert Lee" [email protected]写道:

好……继续关注。谢谢


Reply to this email directly or view it on GitHubhttps://github.com//issues/50#issuecomment-22093967
.

@leeeboo
Copy link
Author

leeeboo commented Aug 5, 2013

有具体方案么?谢谢

@lilj
Copy link

lilj commented Aug 5, 2013


@leeeboo
Copy link
Author

leeeboo commented Aug 5, 2013

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 < count($this->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//issues/50#issuecomment-22094576
.

李博

我们是搞开发的

http://t.sina.com.cn/1749026125?s=6uyXnP

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants