【问题标题】:requestAction is not working in CakePHP 2 Shell CommandrequestAction 在 CakePHP 2 Shell 命令中不起作用
【发布时间】:2020-10-08 03:16:29
【问题描述】:

我正在尝试制作一个 cron shell,为此使用 requestAction 的能力至关重要。

出于测试目的,我已将我的 Shell 缩减为:

class CronShell extends AppShell {
    public $uses = array('Cron');
    
    public function main() {
        $this->requestAction(['controller' => 'events', 'action' => 'play', 38, 0, true, true]);
        echo "This will never be printed to the console, it dies before this.";
    }
}

我仍然无法让它运行。它只是简单地返回表面上成功,但实际上并非如此。 (没有错误)Another SO question 建议的 beforeFilter(和其他生命周期方法)可能是原因,但 我已确保不是这种情况查看更新。

  1. 其他控制器/操作不起作用。
  2. 删除操作的 return 没有帮助。
  3. 使用基于字符串的调用没有帮助。
  4. CakePHP v2.10.22

更新:看起来 Auth 组件可能会导致重定向到 AppController 中的 users/login。然而,我看不到我告诉它重定向到这里的地方,而且我什至没有 users/login 操作。当我从public $components = [] 中删除'Auth' 时,shell 会在 CLI 上运行。

但我无法禁用 Auth!我试过允许(*),将重定向设置为 false,甚至尝试$this->components = ['']。我总是被重定向到用户/登录。

【问题讨论】:

    标签: cakephp cakephp-2.0


    【解决方案1】:

    好吧,事实证明它不是 beforeFilter 或生命周期的任何部分,但我的 AppController 上确实有 Auth 组件,如下所示:

    public $components = [
        'Session',
        'Auth' => [
            'loginRedirect' => ['controller' => 'worlds', 'action' => 'route']
        ]
    ];
    

    无论我做了什么来允许或模拟 cli 身份验证,都会不断地重定向我。所以我将上面的内容简化为 Session 并写在下面,

    if (php_sapi_name() !== 'cli')

    这个:

    $this->components = [
        'Session',
        'Auth' => [
            'loginRedirect' => ['controller' => 'worlds', 'action' => 'route']
        ]
    ];
    

    这从等式中删除了 Auth。我原以为 CakePHP 2 的控制台会告诉我它正在被重定向,但我敢打赌未来的版本会更好地处理它。

    【讨论】:

    • 未来版本放弃了requestAction(),这确实更好,因为它所做的只是鼓励糟糕的应用程序架构;)如果您需要在控制器和外壳之间共享功能,那么这表明您的代码应该投入服务。
    • 不用担心@ndm,你会为我重构的事件控制器感到自豪。胖模特之类的。这里的问题(以及为什么我在 Cake 2 上)是整个系统于 2013 年初开始,此时,已经完成的工作已经完成,我必须专注于制作新系统;该软件从未打算按照我的要求去做,但它真的把它当成了冠军。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多