aop - PHP類中在所有方法被調用前執行一段代碼

來源:互聯網
上載者:User
關鍵字 php aop
如下代碼:

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

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.