CakePHP 如何从 shell 脚本修改验证

CakePHP how to modify validation from shell script

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

我已阅读 the book 中关于动态修改验证的部分,但所有示例均来自模型。当我尝试在 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
       ...

您确定您的 shell 和网络应用 运行 是相同的 CakePHP 核心版本吗?尝试调试 CAKE_CORE_INCLUDE_PATH.

我自己使用的是全局版本,所以当我调用 "cake" 时它会执行全局版本,如果我调用 .\bin\cake 它将使用 repo (3.0在这种情况下)

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

的正确版本

至少部分问题是您破坏了 CakePHP 的 shell 构造。

您需要将 __construct 方法更改为如下内容:

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

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