cakephp 在CRUD中使用uuid进行编辑/删除

wwwo4jvm  于 2023-06-30  发布在  PHP
关注(0)|答案(1)|浏览(143)
  • CakePHP 4.4.14
  • Friendsofcake/crud:6.2.0

出于简单的安全原因,同时也不想泄露表中的行数,我想对edit/delete操作使用uuid字段。
通常它的工作方式是这样的/edit/123。这正是我**不想拥有的。所以我想把它改成/edit/446a1a76-4eac-4b2d-8825-7e3a7e91f4a0
是的,现在我得到错误消息,它不能被转换为数字;这是正确的,因为uuid不是一个数字。
我检查了事件,但根据CRUD文档,WHERE已经设置。

query来自RepositoryQuery对象,其中$PrimaryKey => $IdFromRequest已添加到条件中。

如何将查询中的字段设置/更改为uuid。据我所知,必须在 * beforeFind之前完成,因为参数的类型已经设置为integer,而uuid不是整数。

$this->Crud->on('beforeFind', function(\Cake\Event\EventInterface $event) {
        $event->getSubject()->query->where(['uuid' => "uuid-as-string]);
    });

不起作用,因为条件是added,并且id仍保留在查询中。

  • 明确 *:根据CakePHP规则,每个表都有主键id,但每个表也有用于公共访问的字段uuid。项目内部使用id
gcxthw6b

gcxthw6b1#

AppController中:

public function edit()
{
    ...

    $controllerName = $this->getName();
    $this->getTableLocator()->get($controllerName)->setPrimaryKey("uuid");

    ...
}

然后,在CRUD actions的开始|edit| view处理程序id字段应重新建立为主键。例如,当依赖表的行以edit模式示出时,这是需要的,例如,也用寄存器选项卡实现。
如果id在开始时没有被设置,那么依赖行就找不到,因为CakePHP * 认为 * uuid是主键,而实际上不是。

<ControllerInstance>->getTableLocator()->get(<ControllerName>)->setPrimaryKey("id");

相关问题