文档在这里:https://crud.readthedocs.io/en/latest/actions/bulk-delete.html
但是我不明白,为了批量删除,我的请求URL应该是什么样?我认为这只是使用DELETE方法将模型作为json文件作为模型的通常路径。但是,这似乎不起作用。
大概是因为我错误地将其映射到动作。这是我作为控制器完成的工作:
namespace App\Controller\Api;
use Cake\Controller\Controller;
class ApiAppController extends Controller
{
use \Crud\Controller\ControllerTrait;
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 App\Controller\Api\ApiAppController;
/**
* Devices Controller
*
* @property \App\Model\Table\DevicesTable $Devices
*
* @method \App\Model\Entity\Device[]|\Cake\Datasource\ResultSetInterface 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
当我收到CSRF令牌错误时,它似乎甚至都没有打CRUD插件。普通的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
答案 0 :(得分:0)
因此,我需要解决很多问题。
首先将是您的路由。如果您使用的是DashedRoute
,则URL为http://example.com/examples/delete-all.json
。除非您还传递Accept: application/json
标头。
您还可以在actions
配置中将操作设置为键,该键可用于更改操作名称。 See the documentation。
'actions' => [
'delete-all' => [
'className' => 'Crud.Bulk/Delete'
]
]
对于CSRF令牌问题,您需要解锁操作才能使用DELETE
而不会生成令牌。
在您的控制器中
$this->Security->setConfig('unlockedActions', ['deleteAll']);
否则,您将需要生成CSRF令牌并随请求发送。 Read more on CSRF in the book.