ngmy/laravel.aop

Laravel.Aop 将 Ray.Aop 与 Laravel 集成。

0.9.0 2024-09-18 07:10 UTC

This package is auto-updated.

Last update: 2024-09-18 07:13:56 UTC


README

Latest Stable Version Test Status Lint Status Code Coverage Total Downloads

Laravel.Aop 将 Ray.Aop 与 Laravel 集成。它通过静态织入提供快速的 AOP。

安装

首先,您应该通过 Composer 包管理器安装 Laravel.Aop

composer require ngmy/laravel.aop

您将被询问是否信任 olvlvl/composer-attribute-collector 包,因此应按 y

接下来,您应该配置 olvlvl/composer-attribute-collector 包。

提示

请参阅 composer-attribute-collector 文档 了解如何配置 olvlvl/composer-attribute-collector 包。

然后,您应该使用 vendor:publish Artisan 命令发布 Laravel.Aop 配置文件。此命令将 aop.php 配置文件发布到您应用程序的 config 目录

php artisan vendor:publish --provider="Ngmy\LaravelAop\ServiceProvider"

用法

首先,您应该定义属性。例如,让我们定义 Transactional 属性

<?php

declare(strict_types=1);

namespace App\Attributes;

#[\Attribute(\Attribute::TARGET_METHOD)]
class Transactional {}

接下来,您应该定义拦截器。例如,让我们定义 TransactionalInterceptor 拦截器

<?php

declare(strict_types=1);

namespace App\Interceptors;

use Illuminate\Support\Facades\DB;
use Ray\Aop\MethodInterceptor;
use Ray\Aop\MethodInvocation;

class Transactional implements MethodInterceptor
{
    public function invoke(MethodInvocation $invocation): mixed
    {
        return DB::transaction(static fn (): mixed => $invocation->proceed());
    }
}

提示

请参阅 Ray.Aop 文档 了解更多关于拦截器的信息。

然后,您应该在 config/aop.php 配置文件的 intercept 配置选项中注册属性和拦截器。例如,让我们注册 Transactional 属性和 TransactionalInterceptor 拦截器

use App\Attributes\Transactional;
use App\Interceptors\TransactionalInterceptor;
use Ngmy\LaravelAop\Collections\InterceptMap;

'intercept' => InterceptMap::default()->merge([
    Transactional::class => [
        TransactionalInterceptor::class,
    ],
])->toArray(),

然后,您应该使用属性注释您想要拦截的方法。例如,让我们使用 Transactional 属性注释 UserService 类的 createUser 方法

<?php

declare(strict_types=1);

namespace App\Services;

use App\Attributes\Transactional;
use App\Models\User;

class UserService
{
    #[Transactional]
    public function createUser(string $name): void
    {
        User::create(['name' => $name]);
    }
}

最后,您应该运行 aop:compile Artisan 命令来编译 AOP 类

php artisan aop:compile

在运行 aop:compile Artisan 命令之前,您必须运行 dump-autoload Composer 命令。默认情况下,aop:compile Artisan 命令在编译 AOP 类之前内部运行带有 --no-scripts 选项的 dump-autoload Composer 命令。如果您想自己运行 dump-autoload Composer 命令,应使用 --no-dump-autoload 选项运行 aop:compile Artisan 命令

composer dump-autoload
php artisan aop:compile --no-dump-autoload

警告

如果您想避免覆盖 Composer 自动加载文件,例如在生产环境中优化 Composer 自动加载文件时,应使用 --no-dump-autoload 选项运行 aop:compile Artisan 命令。

重要

在修改 intercept 配置选项或方法属性后,您应该重新编译 AOP 类。但是,如果您只修改方法属性的参数,则不需要重新编译 AOP 类。

现在,使用属性注释的方法将被拦截器拦截。在这个例子中,UserService 类的 createUser 方法将被 TransactionalInterceptor 拦截并在事务中执行。

重要

仅当类实例从服务容器解析为依赖关系时,才会拦截使用属性注释的方法。如果直接创建类实例,则不会拦截方法。

观察者

Laravel.Aop 提供了一个监视器,该监视器会监视文件的变化,并自动重新编译 AOP 类。这在开发应用程序时非常有用。您可以使用 aop:watch Artisan 命令启动监视器

php artisan aop:watch

注意

在重新编译 AOP 类之前,监视器会在内部使用 dump-autoload Composer 命令并带有 --no-scripts 选项。

您可以在 config/aop.php 配置文件的 watcher.paths 配置选项中配置要监视的文件。

提示

自动编译

您可以在运行 dump-autoload Composer 命令后轻松自动编译 AOP 类,只需将 @php artisan aop:compile --no-dump-autoload --ansi 脚本添加到 composer.json 文件的 post-autoload-dump 事件钩子即可。

{
    "scripts": {
        "post-autoload-dump": [
            "Illuminate\\Foundation\\ComposerScripts::postAutoloadDump",
            "@php artisan package:discover --ansi",
            "@php artisan aop:compile --no-dump-autoload --ansi"
        ]
    }
}

内置属性

变更日志

请参阅 变更日志

许可证

Laravel.Aop 是开源软件,根据 MIT 许可证 许可。