webman-aop 切片组件

yzh52521

aop使用教程

composer require yzh52521/webman-aop

在根目录增加define.php

use yzh52521\aop\ClassLoader;

$appConfig = config('app');
if (isset($appConfig['default_timezone'])) {
    date_default_timezone_set($appConfig['default_timezone']);
}
//aop
ClassLoader::reload(config('aop'));
ClassLoader::init();

在start.php文件下引入 define.php

require_once __DIR__ . '/define.php';

增加 AOP 切片 相关配置 我们需要在 config 目录下,增加 aop.php 配置

<?php
return [
    'aspect' => [
        \app\aspect\UserAspect::class,
    ],
];

首先让我们编写待切入类

?php
namespace app\service;

class UserService
{
    public function info()
    {
        echo 'UserService info' . PHP_EOL;
    }
}

其次新增对应的 UserAspect

namespace app\aspect;

use app\service\UserService;
use yzh52521\aop\AbstractAspect;
use yzh52521\aop\interfaces\ProceedingJoinPointInterface;

/**
 * Class UserAspect
 * @package app\aspect
 */
class UserAspect extends AbstractAspect
{
    public $classes = [
        UserService::class . '::info',
    ];

    /**
     * @param ProceedingJoinPointInterface $entryClass
     * @return mixed
     */
    public function process(ProceedingJoinPointInterface $entryClass)
    {
        var_dump('UserAspect before');
        $res = $entryClass->process();
        var_dump('UserAspect after');
        return $res;
    }
}

测试 在app\controller\Index控制器中代码:

public function index()
    {
        /** @var UserService $userService */
        $userService = load(UserService::class);
        $userService->info();
    }

php start.php start, 命令行输出结果:

UserAspect before 
UserService info
UserAspect after 

切入顺序 如果有多个切面类对同一个类方法进行切入, 会按照配置文件中顺序执行

容器 load 函数在 helpers.php 定义如下 :

/**
 *  加载容器的对象
 */
if (! function_exists('load')) {
    function load(string $class)
    {
        return \support\Container::instance()->get($class);
    }
}
1132 3 0
3个评论

Tinywan

又来一个AOP ? 为什么要在根目录增加define.php

  • yzh52521 2022-01-04

    不增加也行
    在start.php 加上这两句
    ClassLoader::reload(config('aop'));
    ClassLoader::init();

  • Tinywan 2022-01-04

    我是有强迫症:不该框架的任何代码。包括start.php,哈哈

walkor

非常感谢你的分享。
webman下个版本尝试规范下组件,做到组件配置与项目配置隔离。并且自动化安装卸载。这样就不会入侵项目的代码了。现在在测试,预计还有几天发布。到时候可以按照规范弄下,就完美了。

Tinywan

写成插件哦!

yzh52521

2036
积分
0
获赞数
0
粉丝数
2021-03-12 加入
🔝