• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

aop – PHP类中在所有方法被调用前执行一段代码

php 搞代码 4年前 (2022-01-25) 24次浏览 已收录 0个评论
文章目录[隐藏]

如下代码:

<code>class ActivityController extends Controller{    public function actionDzp() {        $this->checkAccess();    }    public function actionShake() {        $this->checkAccess();            }    public function actionDraw(){                $this->checkAccess();    }        private function checkAccess(){        // some validation code ...    }</code>

ActivityController中有3个需要在被调用前执行权限校验的公开方法,所以我抽取了一个私有的checkAccess供调用.

PHP中有没有办法以无侵入的方式,在所有类的方法成员被调用前执行一段代码?而非像上面这种方式显式地调用了多次$this->checkAccess();

以AOP的方式? 还是PHP面向对象的语法中本身就有支持这种功能的魔术方法?

谢谢!

回复内容:

如下代码:

<code>class ActivityController extends Controller{    public function actionDzp() {        $this->checkAccess();    }    public function actionShake() {        $this->checkAccess();            }    public function actionDraw(){                $this->checkAccess();    }        private function checkAccess(){        // some validation code ...    }</code>

ActivityController中有3个需要在被调用前执行权限校验的公开方法,所以我抽取了一个私有的checkAccess供调用.

PHP中有没有办法以无侵入的方式,在所有类的方法成员被调用前执行一段代码?而非像上面这种方式显式地调用了多次$this->checkAccess();

以AOP的方式? 还是PHP面向对象的语法中本身就有支持这种功能的魔术方法?

谢谢!

如果你的框架在支持Controller::__call()方法的话,就可以这么干

<code class="php"><?phpclass Controller {    public function __call($method, $args) {        $this->checkAccess();                return call_user_func_array([$this, $method], $args);    }        protected function actionFoo() {}    protected function actionBar() {}    public function actionBaz() {}}</code>

actionFoo和actionBar被声明为protected,所以调用的时候就触发__call()
actionBaz是public,就不会触发__call()

PHP原生不支持AOP,但是通过扩展可以实现:http://aop-php.github.io/
不过即使通过扩展实现,其实现过程还是没有Java那么方便。
建议是通过一些结构调整,通过控制扭转来实现AOP,比如TP会在运行控制器action方法时检查是否存在_before_action_after_action方法并执行。也可以通过类似Java Interceptor的组织逻辑去实现检查。

A) 从代码片段的角度来看,你这样挺好,不需要修改
B) 从控制器的角度来看,checkAccess方法如果在Controller类中声明为protected会更好,因为其他controller也许也需要调用这个
C) 从全局角度考虑,应该在路由分发行为之后根据module+controller+action的组合决定是否调用该检查,且该检查应该在更高级别的对象中声明,而且应该考虑声明为静态方法,如果使用了权限机制应该考虑利用权限机制完成

怎么写代码要根据需求随时调整,所(本文来源gaodai#ma#com搞@@代~&码网

搞代gaodaima码

以没办法给出所谓的“最佳答案”。

直接写在构造方法 __construct
如果检测不通过 就die或自定义你想要的代码

如果该控制中所有方法都需要权限验证,在该控制器中写个初始化方法即可,将验证过程写在_initialize()中,构造函数也可以实现__construct(),或者使用魔术方法__call(),call_user_func_array()

没看明白问题,你说的不会是__construct构造函数吧

之后看了好像又不是这个东西,你这个要是在yii2框架里就可以用存取控制过滤器去实现.要写的东西很多
你就单这一个文件,一般的框架,在行为+事件处理。你就一个文件。不好搞


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:aop – PHP类中在所有方法被调用前执行一段代码

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址