ngmy / laravel.aop
Laravel.Aop 将 Ray.Aop 与 Laravel 集成。
Requires
- php: ^8.1
- laravel/framework: ^9.0 || ^10.0 || ^11.0
- olvlvl/composer-attribute-collector: *
- ray/aop: ^2.10.1
- spatie/file-system-watcher: ^1.2
- symfony/finder: *
Requires (Dev)
- bamarni/composer-bin-plugin: ^1.8
- ergebnis/composer-normalize: ^2.42
- larastan/larastan: ^2.9
- mockery/mockery: ^1.6
- orchestra/testbench: ^7.0 || ^8.0 || ^9.0
- phpstan/extension-installer: ^1.3
README
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 许可证 许可。