如何使用friendsofcake / crud批量删除?

时间:2019-07-24 01:52:22

标签: cakephp-3.0 crud

文档在这里: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

1 个答案:

答案 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.