如何使用朋友蛋糕/粗制滥造批量删除



文档在这里: 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的信息。

最新更新