mixerapi / crud
为您的 CakePHP 项目提供 CRUD(创建、读取、更新、删除)插件的工具。
Requires
- php: ^8.1
- cakephp/cakephp: ^5.0
Requires (Dev)
- friendsofcake/search: ^7.0
- josegonzalez/dotenv: ^3.2
- phpunit/phpunit: ^10.0
Suggests
- friendsofcake/search: Integrates with mixerapi/crud for easy paginatable search filters
README
![稳定性][ico-stability]
此插件通过使用 CakePHP 的依赖注入容器 为您的 RESTful API 控制器操作提供 CRUD(创建/读取/更新/删除)服务。
- 大多数 CRUD 操作只需一行代码即可完成。
- 自动将数据序列化为 JSON、XML 等。
- 自动执行允许的请求
$this-request->allowMethod()
- Crud 与现有的 MixerApi 插件(包括分页和 CakePHP 搜索)很好地协同工作。
- 接口的使用允许您在以后使用自己的具体实现。
- 需要兼容 CakePHP ^4.2 的项目。
您还可以查看 CakePHP Crud,它不依赖于依赖注入。如果您在没有 MixerApi/ExceptionRender 或非 API 项目中使用此插件,请参阅下面的其他用途。
安装
composer require mixerapi/crud bin/cake plugin load MixerApi/Crud
另外,在 composer 安装后,您可以手动在应用程序中加载此插件
# src/Application.php public function bootstrap(): void { $this->addPlugin('MixerApi/Crud'); }
有关其他配置,请参阅插件选项。
用法
启用后,以下服务可以注入到您的控制器操作中。
use MixerApi\Crud\Interfaces\{CreateInterface, ReadInterface, UpdateInterface, DeleteInterface, SearchInterface};
所有 CRUD 服务都从控制器中推断表名,您可以通过调用 setTableName($name)
方法来更改表名。
如果您使用的是 MixerApi\ExceptionRender,则事件将捕获验证错误并为您处理响应,否则将抛出 MixerApi\Crud\Exception\ResourceWriteException
。
有关路径参数的说明,如果您的路径参数不是 id
。
创建
public function add(CreateInterface $create) { $this->set('data', $create->save($this)); }
注意,支持带有 $options
的 save()
。
return $create->save($this, [ 'accessibleFields' => [ 'password' => true, ] ]);
读取
public function view(ReadInteface $read) { $this->set('data', $read->read($this)); }
注意,支持带有 $options
的 read()
。
return $read->save($this, ['contains' => ['OtherTable']]);
返回 CakePHP Query
对象
$query = $read->query($this)
更新
public function edit(UpdateInterface $update) { $this->set('data', $update->save($this)); }
注意,支持带有 $options
的 update()
。
return $update->save($this, [ 'accessibleFields' => [ 'password' => true, ] ]);
删除
public function delete(DeleteInterface $delete) { return $delete->delete($this)->respond(); // calling respond() is optional }
注意,支持带有 $options
的 delete()
。
return $delete->delete($this, ['atomic' => false]);
搜索
搜索服务与 分页 以及可选的 CakePHP 搜索 协同工作。
示例
public function index(SearchInterface $search) { $this->set('data', $search->search($this)); }
要使用 CakePHP 搜索,在控制器中的 initialize()
方法中正常初始化组件。
$this->set('data', $search->search($this));
对于自定义 CakePHP 搜索集合,请调用 setCollection($name)
方法
$this->set('data', $search->setCollection('collection_name')->search($this));
返回 CakePHP Query
对象
$query = $search->query($this);
序列化
序列化由 Controller.beforeRender
监听器处理。它序列化所有 CRUD 操作的第一个视图变量,并且不会对非 CRUD 操作运行。有关禁用序列化的说明,请参阅选项。
允许的 HTTP 方法
允许的方法由 Controller.initialize
监听器处理。有关禁用或修改默认值的说明,请参阅插件选项。
您还可以在任意服务上调用 setAllowMethods($methods)
以覆盖默认行为。此方法接受字符串或任何数组作为参数,就像本机 $request->allowedMethods()
一样。
插件选项
您可以通过在添加插件时传递一个选项数组来自定义功能。
# src/Application.php public function bootstrap(): void { $this->addPlugin('MixerApi/Crud', $options); }
自定义允许的 HTTP 方法
$options = [ 'allowedMethods' => [ 'add' => ['post'], 'edit' => ['patch'], 'delete' => ['delete'], ] ];
要完全禁用自动 $request->allowMethod()
$options = [ 'allowedMethods' => [] ];
禁用自动序列化
$options = [ 'doSerialize' => false, // default is true ];
其他
路径参数
如果您的资源路径参数不是 id
,则将标识符作为第二个参数传递
public function view(ReadInteface $read, string $id) { $this->set('data', $read->read($this, $id)); }
上述内容也适用于更新和删除。
其他用法
此插件与使用 MixerApi/ExceptionRender 的 API 项目配合使用最佳,该插件使用事件在发生错误时设置响应。如果您的项目没有使用 ExceptionRender 或您不是 API,您可以编写自定义异常渲染器,并查找 ResourceWriteException
,然后使用 EntityInterface
从 ResourceWriteException::getEntity()
修改 viewVars
输出。
有关更多信息,请阅读 CakePHP 自定义 ExceptionRenderer 文档。