如下代碼:
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架構裡就可以用存取控制過濾器去實現.要寫的東西很多
你就單這一個檔案,一般的架構,在行為+事件處理。你就一個檔案。不好搞