claudye/laravel-hooks

此包最新版本(v1.0.0)没有可用的许可证信息。

Laravel trait 用于在方法调用前后挂钩

v1.0.0 2024-09-20 10:53 UTC

This package is auto-updated.

Last update: 2024-09-25 09:58:03 UTC


README

Laravel Hooks 是一个 Laravel trait,允许您在 Laravel 控制器中注册在调用指定方法前后执行的挂钩(回调)。这有助于在不改变其核心逻辑的情况下修改或扩展方法的行为。

1. 功能和用法

主要功能

  • 前后挂钩:轻松注册在特定控制器(操作)方法前后执行的回调。
  • 非侵入式方法修改:在不接触核心代码的情况下扩展或修改方法的行为。
  • 自动挂钩设置:通过使用预定义的 useHooks 方法自动使用挂钩。

使用案例

  • 日志记录:在执行某些方法前后自动记录操作。
  • 数据验证:在执行关键方法之前添加复杂的验证逻辑。
  • 响应转换:在调用方法后修改或格式化方法的返回值。
  • 控制器实例修改:在执行方法之前修改控制器实例,这对于结合依赖注入非常有用。
  • 横切关注点:在不重复代码的情况下将逻辑应用于多个方法,如审计或授权。

2. 安装

您可以通过 Composer 安装此包。确保您的 Laravel 版本是 7.x 或更高版本(支持至 11.x)。

运行以下命令安装包

composer require claudye/laravel-hooks

3. 使用示例

以下是如何在您的 Laravel 控制器或类中使用 HasControllerHooks trait 的示例

namespace App\Http\Controllers;

use LaravelHooks\Traits\HasControllerHooks;
use Illuminate\Http\Request;

class ExampleController extends Controller
{
    use HasControllerHooks;

    public function index(Request $request)
    {
        // Your logic here.
        return [
            "users" => $this->queryBuilder->all()
        ];
    }

    public function show(Request $request)
    {
        // Your logic here.
        return [
            "user" => $user
        ];
    }

    /**
     * Defines hooks for methods in the controller.
     */
    public function useHooks()
    {
        // Register a before hook for the 'index' method
        $this->beforeCalling(['index', 'show'], function ($request,...$parameters, $method) {
            
            $this->queryBuilder->filters($request->all()); 

            logger('Before calling index method');
        });

        // Register an after hook for the 'index' method
        $this->afterCalling(['index',"show","edit"], function ($request, $result,...$parameters, $method) {

            // Modify the result after the 'index' method is called
            logger('After calling index method');

            event(new SomeEvent($result))

            return response()->json([
                'data'=>$result
            ]);
        });

        // You can add other hooks as necessary.
    }
}

高级用法

1. 在方法执行前修改控制器实例

您可以在执行方法之前修改控制器实例本身,这在与 依赖注入 一起工作时特别有用。

示例

$this->beforeCalling(['store',"update","delete"], function ($parameter1, $parameter2,...$methodName) {
    // Modify the controller instance before executing 'store' method
    $this->someService = app(SomeService::class)->init();

    $parameter1->modify();
});

错误处理

如果在尝试通过 callAction 方法调用不存在的方法时抛出异常,将抛出 BadMethodCallException,在开发过程中提供更多清晰度。

4. 要求

  • Laravel 7.x 至 11.x

5. 许可证

此包是开源软件,根据 MIT 许可证 许可。