CakePHP 3-插入请求数据和程序化数据的组合

时间:2018-08-23 10:14:28

标签: php cakephp-3.0

CakePHP 3.5.13

我有一个表类Model/Table/SavedSearchesTable.php和一个对应的实体类Model/Entity/SavedSearch.php

我要做的是向用户显示一个表格,他们可以在其中向1个字段中输入数据,该字段对应于上表中名为search_name的字段。我想使用用户输入此表单的数据(即请求数据),并在我的Controller中以编程方式设置其他字段。

我不确定这是否正确,但是要使用Cake的Form Helper,我需要执行以下操作:

// Controller/FrontController.php
public function saveSearch()
{
    $SavedSearches = TableRegistry::get('SavedSearches');
    $save_search = $SavedSearches->newEntity();
    $this->set('save_search', $save_search);
}

然后在表单助手中使用$save_search的模板中:

// Template/Front/save_search.ctp
echo $this->Form->create($save_search, [
'url' => ['controller' => 'Front', 'action' => 'saveSearch'],
'role' => 'form'
]);

echo $this->Form->control('search_name');

我不确定以上内容是否适用于“新记录”,但它似乎可以正常工作并正确发布到/front/save-search

因此,我将使用以下内容以编程方式设置一些数据以及请求数据search_name字段:

$SavedSearches = TableRegistry::get('SavedSearches');

$data = [
    'u_id' => $this->_getUserId(), // set programatically, not request data
    'search_name' => $this->request->getData('search_name'), // comes from request data
    'data' => 'testing' // set programatically, not request data
 ];

$entity = $SavedSearches->newEntity($data);

if ($SavedSearches->save($entity)) {
    debug('saved');
} else {
    debug('NOT saved');
}

这总是保存(输出在debug()语句中“保存”,并进入数据库)。

但是,我认为这不对,因为在Table类中有以下验证规则:

// Model/Table/SavedSearchesTable.php
public function validationDefault(Validator $validator)
{
    $validator
        ->scalar('search_name')
        ->maxLength('search_name', 255)
        ->requirePresence('search_name', 'create')
        ->notEmpty('search_name');

     return $validator;
 }

如果我输入的search_name字段超过255个字符(我尝试超过500个字符),则可以保存而不会出错。

那么几个问题:

  1. 您如何使用Form Helper以这种方式启动用于保存“新”记录的表单,其中您要保存的所有内容都不是请求数据的一部分?

  2. 如何使验证正确运行?该文档建议进行验证的过程分为两个步骤,但是其中第一个应该在将请求数据转换为实体之前触发。

我已经阅读了Validating DataSaving Data上的文档,但是找不到有关如何进行此类操作的清晰示例,这显然是相当普遍的情况,因为并非所有情况保存的内容必须始终来自网络表单。

0 个答案:

没有答案