指南
钩子
钩子(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());
}
}
事务
默认情况下,钩子中执行的查询以及操作本身的查询(例如更新一个实体)不会被包裹在事务中。你可以通过以下方式轻松改变这一行为:
- 在
orion.php配置文件中将transactions.enabled设为true,这会影响所有控制器 - 在任意控制器上重写
transactionsAreEnabled方法,以进行更细粒度的控制
模型控制器上的钩子
- beforeIndex - 在获取模型列表之前执行。
- afterIndex - 在获取模型列表之后、构建响应之前执行。
- beforeShow - 在获取模型之前执行。
- afterShow - 在获取模型之后、构建响应之前执行。
- beforeStore - 在创建新的模型实例并填充属性之前执行。
- afterStore - 在保存模型之后、构建响应之前执行。
- beforeUpdate - 在获取模型并填充属性之前执行。
- afterUpdate - 在更新模型之后、构建响应之前执行。
- beforeSave - 在模型保存之前执行,但在
beforeStore和beforeUpdate之后。 - afterSave - 在模型保存之后执行,但在
afterStore和afterUpdate之前。 - beforeDestroy - 在获取模型并删除它之前执行。
- afterDestroy - 在删除模型之后、构建响应之前执行。
- beforeRestore - 在获取模型并恢复它之前执行。
- afterRestore - 在恢复模型之后、构建响应之前执行。
- beforeFresh - 在保存后刷新模型之前执行,但在
afterSave和afterStore之前。
批量钩子:
- beforeBatchStore - 在创建新模型之前执行。
- afterBatchStore - 在保存新模型之后、构建响应之前执行。
- beforeBatchUpdate - 在获取待更新的模型之前执行。
- afterBatchUpdate - 在更新模型之后、构建响应之前执行。
- beforeBatchDestroy - 在获取待删除的模型之前执行。
- afterBatchDestroy - 在删除模型之后、构建响应之前执行。
- beforeBatchRestore - 在获取待恢复的模型之前执行。
- afterBatchRestore - 在恢复模型之后、构建响应之前执行。
在批量操作中,相关的 "before" 和 "after" 钩子(例如
beforeStore、afterStore)以及 beforeSave 和 afterSave 也会对每个模型逐一执行。关联控制器上的钩子
**所有类型:**关联控制器与模型控制器一样,为 CRUD 操作提供 before 和 after 钩子。
一对多:
- beforeAssociate - 在获取两个模型之后、关联子模型之前执行。
- afterAssociate - 在保存带有已关联子模型 id 的关联模型之后、构建响应之前执行。
- beforeDissociate - 在获取两个模型之后、解除子模型关联之前执行。
- afterDissociate - 在保存带有已关联子模型 id 的关联模型之后、构建响应之前执行。
多对多:
- beforeSync - 在获取关联模型之前执行。
- afterSync - 在同步相关模型之后、构建响应之前执行。
- beforeToggle - 在获取关联模型之前执行。
- afterToggle - 在切换相关模型之后、构建响应之前执行。
- beforeAttach - 在获取关联模型之前执行。
- afterAttach - 在将相关模型附加到关联模型之后、构建响应之前执行。
- beforeDetach - 在获取关联模型之前执行。
- afterDetach - 在将相关模型从关联模型分离之后、构建响应之前执行。
- beforeUpdatePivot - 在获取关联模型之前执行。
- afterUpdatePivot - 在更新相关模型的中间表数据之后、构建响应之前执行。