指南

钩子

钩子(Hooks)是 Orion 的强大特性之一。它让你无需重写方法本身,即可介入某个端点(或多个端点)内部的执行流程。

这是一个常见的使用场景:假设你有一个用于博客文章的 API 控制器,每当创建一篇博客文章时,都需要将其与当前认证的用户关联起来。要实现这一点,只需添加一个 beforeSave 钩子,并将用户与文章关联:

<?php

namespace App\Http\Controllers\Api;

use App\Models\Post;
use Orion\Http\Requests\Request;
use Orion\Http\Controllers\Controller;

class PostsController extends Controller
{
    /**
     * @var string|null $model
     */
    protected $model = Post::class;

    /**
     * @param Request $request
     * @param Post $post
     */
    protected function beforeSave(Request $request, $post)
    {
        $post->user()->associate($request->user());
    }
}

事务

默认情况下,钩子中执行的查询以及操作本身的查询(例如更新一个实体)不会被包裹在事务中。你可以通过以下方式轻松改变这一行为:

  1. orion.php 配置文件中将 transactions.enabled 设为 true,这会影响所有控制器
  2. 在任意控制器上重写 transactionsAreEnabled 方法,以进行更细粒度的控制

模型控制器上的钩子

  • beforeIndex - 在获取模型列表之前执行。
  • afterIndex - 在获取模型列表之后、构建响应之前执行。
  • beforeShow - 在获取模型之前执行。
  • afterShow - 在获取模型之后、构建响应之前执行。
  • beforeStore - 在创建新的模型实例并填充属性之前执行。
  • afterStore - 在保存模型之后、构建响应之前执行。
  • beforeUpdate - 在获取模型并填充属性之前执行。
  • afterUpdate - 在更新模型之后、构建响应之前执行。
  • beforeSave - 在模型保存之前执行,但在 beforeStorebeforeUpdate 之后。
  • afterSave - 在模型保存之后执行,但在 afterStoreafterUpdate 之前。
  • beforeDestroy - 在获取模型并删除它之前执行。
  • afterDestroy - 在删除模型之后、构建响应之前执行。
  • beforeRestore - 在获取模型并恢复它之前执行。
  • afterRestore - 在恢复模型之后、构建响应之前执行。
  • beforeFresh - 在保存后刷新模型之前执行,但在 afterSaveafterStore 之前。

批量钩子:

  • beforeBatchStore - 在创建新模型之前执行。
  • afterBatchStore - 在保存新模型之后、构建响应之前执行。
  • beforeBatchUpdate - 在获取待更新的模型之前执行。
  • afterBatchUpdate - 在更新模型之后、构建响应之前执行。
  • beforeBatchDestroy - 在获取待删除的模型之前执行。
  • afterBatchDestroy - 在删除模型之后、构建响应之前执行。
  • beforeBatchRestore - 在获取待恢复的模型之前执行。
  • afterBatchRestore - 在恢复模型之后、构建响应之前执行。
在批量操作中,相关的 "before" 和 "after" 钩子(例如 beforeStoreafterStore)以及 beforeSaveafterSave 也会对每个模型逐一执行。

关联控制器上的钩子

**所有类型:**关联控制器与模型控制器一样,为 CRUD 操作提供 before 和 after 钩子。

一对多:

  • beforeAssociate - 在获取两个模型之后、关联子模型之前执行。
  • afterAssociate - 在保存带有已关联子模型 id 的关联模型之后、构建响应之前执行。
  • beforeDissociate - 在获取两个模型之后、解除子模型关联之前执行。
  • afterDissociate - 在保存带有已关联子模型 id 的关联模型之后、构建响应之前执行。

多对多:

  • beforeSync - 在获取关联模型之前执行。
  • afterSync - 在同步相关模型之后、构建响应之前执行。
  • beforeToggle - 在获取关联模型之前执行。
  • afterToggle - 在切换相关模型之后、构建响应之前执行。
  • beforeAttach - 在获取关联模型之前执行。
  • afterAttach - 在将相关模型附加到关联模型之后、构建响应之前执行。
  • beforeDetach - 在获取关联模型之前执行。
  • afterDetach - 在将相关模型从关联模型分离之后、构建响应之前执行。
  • beforeUpdatePivot - 在获取关联模型之前执行。
  • afterUpdatePivot - 在更新相关模型的中间表数据之后、构建响应之前执行。