CakePHP 如何从 shell 脚本修改验证


CakePHP how to modify validation from shell script

我正在使用CakePHP v2.6,我正在编写一个shell脚本,该脚本需要具有与模型$validates属性中的验证规则略有不同的验证规则。

我已经阅读了书中关于动态修改验证的部分,但所有示例都来自模型中。当我尝试在 shell 脚本中执行$this->MyModel->validator()时,我得到:

Fatal Error Error: Call to undefined function validator()

这是为什么呢?

更新:奇怪的是,以下代码确实有效:

unset($this->MyModel->validate['fieldName'] );

我的代码:

<?php
App::uses('AppShell', 'Console/Command');
App::uses('CakeSchema', 'Model');
class ScrapeShell extends AppShell {
    public $uses = array('Listing', 'Neighborhood', 'ListingPhoto');
    function __construct() {
       parent::__construct();
       //initialize some variables
   }
   public function myMethod() {
       #bypass validation on description to allow HTML
       unset($this->Listing->validate['description'] ); //this works
       //$this->Listing->validator()->remove('description', 'noTags'); //this errors
       ...

至少部分问题在于你破坏了 CakePHP 的 shell 结构。

您需要将__construct方法更改为如下所示:

public function __construct($stdout = null, $stderr = null, $stdin = null) {
    parent::__construct($stdout, $stderr, $stdin);
    //your code here
}

至于模型的子对象,如果不看到模型代码,很难说什么会干扰该实例化,但如果也覆盖了模型构造函数,则可能会干扰正确的模型设置。

你确定你的shell和Web应用程序运行的是相同的CakePHP核心版本吗?尝试调试CAKE_CORE_INCLUDE_PATH。

我自己使用的是全局版本,所以当我只调用"cake"时,它将执行全局版本,如果我调用 .''bin''cake,它将使用存储库中的版本(在本例中为 3.0)

您确定该应用程序找到了正确的核心版本吗?有问题的核心第二行在任何情况下都可以工作,因为它在 2.6 之前就已经存在了。我很确定您的模型不存在核心模型类的正确版本。