热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

php命令执行类中的方法,aopPHP类中在所有方法被调用前执行一段代码

如下代码:classActivityControllerextendsController{publicfunctionactionDzp(){$this-chec

如下代码:

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 ...

}

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

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

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

谢谢!

回复内容:

如下代码:

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 ...

}

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

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

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

谢谢!

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

checkAccess();

return call_user_func_array([$this, $method], $args);

}

protected function actionFoo() {}

protected function actionBar() {}

public function actionBaz() {}

}

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的组合决定是否调用该检查,且该检查应该在更高级别的对象中声明,而且应该考虑声明为静态方法,如果使用了权限机制应该考虑利用权限机制完成

怎么写代码要根据需求随时调整,所以没办法给出所谓的“最佳答案”。

直接写在构造方法 __construct

如果检测不通过 就die或自定义你想要的代码

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

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

之后看了好像又不是这个东西,你这个要是在yii2框架里就可以用存取控制过滤器去实现.要写的东西很多

你就单这一个文件,一般的框架,在行为+事件处理。你就一个文件。不好搞

本文原创发布php中文网,转载请注明出处,感谢您的尊重!



推荐阅读
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文介绍了如何使用PHP向系统日历中添加事件的方法,通过使用PHP技术可以实现自动添加事件的功能,从而实现全局通知系统和迅速记录工具的自动化。同时还提到了系统exchange自带的日历具有同步感的特点,以及使用web技术实现自动添加事件的优势。 ... [详细]
  • 本文详细介绍了GetModuleFileName函数的用法,该函数可以用于获取当前模块所在的路径,方便进行文件操作和读取配置信息。文章通过示例代码和详细的解释,帮助读者理解和使用该函数。同时,还提供了相关的API函数声明和说明。 ... [详细]
  • 电话号码的字母组合解题思路和代码示例
    本文介绍了力扣题目《电话号码的字母组合》的解题思路和代码示例。通过使用哈希表和递归求解的方法,可以将给定的电话号码转换为对应的字母组合。详细的解题思路和代码示例可以帮助读者更好地理解和实现该题目。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了使用kotlin实现动画效果的方法,包括上下移动、放大缩小、旋转等功能。通过代码示例演示了如何使用ObjectAnimator和AnimatorSet来实现动画效果,并提供了实现抖动效果的代码。同时还介绍了如何使用translationY和translationX来实现上下和左右移动的效果。最后还提供了一个anim_small.xml文件的代码示例,可以用来实现放大缩小的效果。 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文介绍了C++中省略号类型和参数个数不确定函数参数的使用方法,并提供了一个范例。通过宏定义的方式,可以方便地处理不定参数的情况。文章中给出了具体的代码实现,并对代码进行了解释和说明。这对于需要处理不定参数的情况的程序员来说,是一个很有用的参考资料。 ... [详细]
  • 本文介绍了Perl的测试框架Test::Base,它是一个数据驱动的测试框架,可以自动进行单元测试,省去手工编写测试程序的麻烦。与Test::More完全兼容,使用方法简单。以plural函数为例,展示了Test::Base的使用方法。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
author-avatar
pupupupupupupupupu
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有