文档在这里: https://crud.readthedocs.io/en/latest/actions/bulk-delete.html
但我不明白的是,我的请求 URL 应该是什么样子才能点击批量删除?我假设它只是使用 DELETE 方法作为 json 文件的模型的通常 crud 路径。但是,这似乎不起作用。
大概这是因为我错误地将其映射到操作。以下是我作为控制器所做的工作:
namespace AppControllerApi;
use CakeControllerController;
class ApiAppController extends Controller
{
use CrudControllerControllerTrait;
public $components = [
'RequestHandler',
'Crud.Crud' => [
'actions' => [
'Crud.Index',
'Crud.View',
'Crud.Add',
'Crud.Edit',
'Crud.Delete',
'Crud.Bulk/Delete'
],
'listeners' => [
'Crud.Api',
'Crud.ApiPagination',
'Crud.ApiQueryLog',
'Crud.Search'
]
]
];
}
我也像这样尝试了控制器:
use AppControllerApiApiAppController;
/**
* Devices Controller
*
* @property AppModelTableDevicesTable $Devices
*
* @method AppModelEntityDevice[]|CakeDatasourceResultSetInterface paginate($object = null, array $settings = [])
*/
class DataController extends ApiAppController
{
public function initialize()
{
parent::initialize();
$this->Crud->mapAction('deleteAll', 'Crud.Bulk/Delete');
}
public function deleteAll()
{
$connection = ConnectionManager::get('default');
$results = $connection->execute('TRUNCATE TABLE data');
}
}
对 URL 进行各种尝试,如下所示:
DELETE http://my-site:8888/api/data.json
DELETE http://my-site:8888/api/data/delete.json
DELETE http://my-site:8888/api/data/delete-all.json
DELETE http://my-site:8888/api/data/all.json
它似乎甚至没有击中 CRUD 插件,因为我收到 CSRF 令牌错误。正常的 crud 路由不会收到 CSRF 错误,因为它们被路由拾取:
Router::prefix('api', function ($routes) {
$routes->extensions(['json', 'xml']);
$routes->resources('Data');
});
关于 RESTful 路由的 cakephp 文档没有涵盖如何处理批量操作:https://book.cakephp.org/3.0/en/development/routing.html#resource-routes
我会考虑很多事情来解决此问题。
首先是你的路由。如果您使用的是DashedRoute
则网址将http://example.com/examples/delete-all.json
。除非您还传递Accept: application/json
标头。
您还可以在actions
配置中将操作设置为键,该键可用于更改操作名称。请参阅文档。
'actions' => [
'delete-all' => [
'className' => 'Crud.Bulk/Delete'
]
]
至于您的CSRF令牌问题,您需要解锁操作才能在不生成令牌的情况下使用DELETE
。
在控制器中 $this->Security->setConfig('unlockedActions', ['deleteAll']);
或者,您需要生成一个 CSRF 令牌并将其与您的请求一起发送。在书中阅读更多关于CSRF的信息。