Cakephp api POST请求,保存数据而不验证

34gzjxbg  于 2022-11-11  发布在  PHP
关注(0)|答案(1)|浏览(179)

我创建了一个带有Api前缀的路由

$routes->scope('/api', function (RouteBuilder $routes) {
        $routes->setExtensions(['json']);

        $routes->post(
            '/add-categories',
            ['controller' => 'Miles', 'action' => 'addCategories','prefix'=>'Api']
        );
 }

我已经在目录Controller/Api/MilesController.php中创建了一个控制器文件
我创建了一个addCategory方法,如下所示

public function addCategories()
    {
            $categoriesTable = $this->fetchTable('Categories');
            $categoryEnt = $categoriesTable->newEmptyEntity();
            if ($this->request->is('post')) {
                $category = $categoriesTable->patchEntity($categoryEnt, $this->request->getData());
                if ($categoriesTable->save($category)) {
                    $responseBody = [
                        'status' => 201,
                        'data' => $category
                    ];
                }else{
                    $responseBody = [
                        'status' => 400,
                        'data' => $category->getErrors()
                    ];
                }
            }
            $this->set(compact('responseBody'));
            $this->viewBuilder()->setOption('serialize', ['responseBody']);
   }

在postman中,如果我尝试发送一个没有任何数据的post请求,那么我会得到如下的响应

{
    "responseBody": {
        "status": 201,
        "data": {
            "created": "2022-05-10T20:04:13+09:00",
            "modified": "2022-05-10T20:04:13+09:00",
            "id": 8
        }
    }
}

我的模型/表格/类别表. php看起来像

<?php
declare(strict_types=1);

namespace App\Model\Table;

use Cake\ORM\Query;
use Cake\ORM\RulesChecker;
use Cake\ORM\Table;
use Cake\Validation\Validator;

class CategoriesTable extends Table
{
    public function initialize(array $config): void
    {
        parent::initialize($config);

        $this->setTable('categories');
        $this->setDisplayField('name');
        $this->setPrimaryKey('id');

        $this->addBehavior('Timestamp');

        $this->hasMany('Products', [
            'foreignKey' => 'category_id',
        ]);
    }

    public function validationDefault(Validator $validator): Validator
    {
        $validator
            ->allowEmptyString('id', null, 'create');

        $validator
            ->scalar('title')
            ->notEmptyString('title');

        $validator
            ->boolean('status')
            ->notEmptyString('status');

        $validator
            ->scalar('imageUrl')
            ->allowEmptyFile('imageUrl');

        return $validator;
    }
}

为什么我写在CategoriesTable.php文件中的notEmptyString验证不起作用?注意:这个Api/MilesController.php没有self模型。我如何在这里应用CategoriesTable验证?

64jmpszr

64jmpszr1#

没有字段设置为必填字段,即它们都是可选的,如果缺少可选字段,则不会应用验证规则。
因此,对于必须存在的所有字段,请使用requirePresence(),例如:

$validator
    ->requirePresence('title', 'create') // required on create, optional on update
    ->scalar('title')
    ->notEmptyString('title');

另请参阅

*Cookbook〉验证〉创建验证器〉要求字段存在

相关问题