當前位置: 妍妍網 > 碼農

Go!PHP物件導向的現代AOP框架

2024-04-02碼農

簡介

AOP是一個現代的面向方面的框架,使用簡單的PHP,具有豐富的功能,適用於新級別的軟體開發。該框架允許在傳統的物件導向的PHP程式碼中解決橫切問題,為您的程式碼提供高效和透明的勾點系統。

特征

  • 為PHP提供動態勾點系統,無需更改原始原始碼。

  • 不需要任何PECL擴充套件(php-aop,runkit,uopz)和DI容器即可工作。

  • 物件導向的方面、連線點和切入點設計。

  • 攔截類中任何公共或受保護方法的執行。

  • 攔截靜態方法和final類中方法的執行。

  • 攔截traits中方法的執行。

  • 攔截對物件的公共/受保護內容的存取。

  • 用於靜態類初始化的勾點(在類載入到PHP記憶體之後)。

  • 用於物件初始化的勾點(截取 new 關鍵字)。

  • 攔截系統PHP函式的呼叫。

  • 能夠透過 Around 型別的通知更改任何方法/函式的返回值。

  • 於在原始碼中定義切入點的豐富切入點語法。

  • 使用Xcad進行AOP的本機偵錯。具有編織方面的程式碼是完全可讀的和原生的。您可以在原始類或方面中放置斷點,它將工作(對於偵錯模式)!

  • 可以與任何現有的PHP框架和庫整合(有或沒有額外的配置)。

  • 高度最佳化的生產用途:支持操作碼緩存,延遲載入建議和方面,連線點緩存,沒有執行時檢查切入點,沒有執行時註釋解析,沒有 evals __call 方法,沒有慢速代理和 call_user_func_array() 。快速引導過程(2- 20毫秒)和通知呼叫。

  • 什麽是AOP?

    AOP(物件導向編程)是一種處理橫切關註點的方法,這些關註點是以「模組化」的方式設計和實作的(也就是說,有適當的封裝,沒有重復等),然後以簡潔和健壯的方式整合到所有相關的執行點中,例如透過聲明性或編程性手段。

    在AOP術語中,執行點被稱為連線點。這些點的集合稱為切入點,在連線點之前、之後或「周圍」執行的新行為稱為通知。你可以在Introduction部份閱讀更多關於AOP的內容。

    安裝

    AOP框架可以與composer一起安裝。安裝非常簡單

    Step 1 使用composer下載庫

    請composer下載最新版本的Go!AOP框架及其依賴項,執行以下命令:

    composer require goaop/framework

    Composer會將框架安裝到計畫的 vendor/goaop/framework 目錄中。

    Step 2 建立應用程式方面內核

    這個框架的目的是為您的應用程式提供簡單的AOP整合。你必須首先為你的應用程式建立 AspectKernel 類。這個類將在一個地方管理應用程式的所有方面。

    該框架提供了基礎類別,使建立自己的內核變得更容易。要建立應用程式內核,請擴充套件抽象類 Go\Core\AspectKernel

    <?php
    // app/ApplicationAspectKernel.php
    useGo\Core\AspectKernel;
    useGo\Core\AspectContainer;
    /**
     * Application Aspect Kernel
     */

    classApplicationAspectKernelextendsAspectKernel
    {
    /**
    * Configure an AspectContainer with advisors, aspects and pointcuts
    *
    @param AspectContainer $container
    *
    @return void
    */

    protectedfunctionconfigureAop(AspectContainer $container)
    {
    }
    }

    Step 3 在前端控制器中配置aspect內核

    要配置方面內核,請呼叫內核例項的 init() 方法。

    // front-controller, for Symfony2 application it's web/app_dev.php
    include __DIR__ . '
    /vendor/autoload.php'; // use composer
    // Initialize an application aspect container
    $applicationAspectKernel = ApplicationAspectKernel::getInstance();
    $applicationAspectKernel->init([
    '
    debug' => true, // use 'false' for production mode
    '
    appDir' => __DIR__ . '/..', // Application root directory
    '
    cacheDir' => __DIR__ . '/path/to/cache/for/aop', // Cache directory
    // Include paths restricts the directories where aspects should be applied, or empty for all source files
    '
    includePaths' => [
    __DIR__ . '
    /../src/'
    ]
    ]);

    Step 4 建立一個方面

    方面是AOP哲學的關鍵元素。走!AOP框架只使用簡單的PHP類來聲明方面,這使得物件導向的所有特性都可以用於方面類。作為一個例子,讓我們截取所有的方法並顯示它們的名稱:

    // Aspect/MonitorAspect.php
    namespace Aspect;
    use Go\Aop\Aspect;
    use Go\Aop\Intercept\FieldAccess;
    use Go\Aop\Intercept\MethodInvocation;
    use Go\Lang\Annotation\After;
    use Go\Lang\Annotation\Before;
    use Go\Lang\Annotation\Around;
    use Go\Lang\Annotation\Pointcut;
    /**
     * Monitor aspect
     */
    class MonitorAspect implements Aspect
    {
    /**
    * Method that will be called before real method
    *
    * @param MethodInvocation $invocation Invocation
    * @Before("execution(public Example->*(*))")
    */
    public function beforeMethodExecution(MethodInvocation $invocation)
    {
    echo'Calling Before Interceptor for: ',
    $invocation,
    ' with arguments: ',
    json_encode($invocation->getArguments()),
    "<br>\n";
    }
    }


    很簡單,不是嗎?我們在這裏聲明,我們希望在執行Example類中的所有動態公共方法之前安裝一個勾點。這是在註釋#0的幫助下完成的#勾點可以是任何型別,你稍後會看到它們。但是我們不改變類Example中的任何程式碼!我能感受到你的驚訝。

    Step 5 在方面內核中註冊方面

    要註冊 aspect ,只需在內核的 configureAop() 方法中添加它的例項:

    // app/ApplicationAspectKernel.php
    use Aspect\MonitorAspect;
    //...
    protected function configureAop(AspectContainer $container)
    {
    $container->registerAspect(new MonitorAspect());
    }
    //...


    Step 6 可選配置

    預設情況下,Go!AOP使用 Doctrine\Common\Cache\FilesystemCache 來緩存註釋。但是,如果您需要使用任何其他緩存引擎進行註釋,您可以透過應用程式方面內核的 annotationCache 配置選項配置緩存驅動程式。唯一的要求是緩存驅動程式實作 Doctrine\Common\Cache\Cache 介面。

    這在部署到唯讀檔案系統時非常有用。在這種情況下,你可以使用,例如: Doctrine\Common\Cache\ArrayCache 或一些基於記憶體的緩存驅動程式。