【问题标题】:using components in Cakephp 2+ Shell在 Cakephp 2+ Shell 中使用组件
【发布时间】:2023-03-28 21:01:01
【问题描述】:

我正在尝试使用 cakephp shell 为我的应用程序实现一项任务。该任务涉及运行一个长时间运行的进程(因此需要使用 shell)。

该函数需要我在一个名为 CommonComponent 的组件中使用一个函数

不幸的是,每当我尝试包含该组件时,我都会收到以下错误 PHP 致命错误:在 /var/www/nginx-test/app/Controller/Component/CommonComponent.php 中找不到类“组件”

这里是被调用的 CronShell 类

class CronShell extends AppShell {
   public function main() {
        $this->out('Hello world.');      
//  $this->out(phpinfo());
    }
     public function test()
    {
         $this->out('Before Import'); 
        App::import('Component', 'Common');
        $this->out('Import complete');
        // $this->Common=ClassRegistry::init('CommonComponent');
        $this->Common =new CommonComponent();
        $this->out('Initialization complete');
        $this->Common->testCron();
         $this->out('FunctionCall complete');
        //$this->Common->saveCacheEntry("name","value");
    }
    }

CommonComponent类存储为app/Controller/Component/CommonComponent.php,如下

 class CommonComponent extends Component
{
 function testCron()
    {    
     $this->out('Hello world from Component.');
    }
 }

有什么想法吗?

【问题讨论】:

  • 考虑更新接受的答案?

标签: components cakephp-2.0


【解决方案1】:

我最近不得不用我写的 MTurk 组件来做这件事。我的最终解决方案是使用 lib 而不是组件。然后我让组件访问 lib,这样我就可以使用组件和 shell 中的方法。

但是,这里的代码将允许您从 shell 加载组件。

<?php
App::uses('AppShell', 'Console/Command');
App::uses('ComponentCollection', 'Controller');
App::uses('Controller', 'Controller');
App::uses('MTurkComponent', 'Controller/Component');

class ProcessCompletedTask extends Shell {
    public function execute() {
        $this->out("Processing...\n");
        $collection = new ComponentCollection();
        $this->MTurk = new MTurkComponent($collection);
        $controller = new Controller();
        $this->MTurk->initialize($controller);

        $this->MTurk->processHITs();
        $this->out("Complete\n");
    }
}

【讨论】:

  • 这可行,但我收到关于 $controller 为空的警告。要修复此警告,请添加 App::uses('Controller', 'Controller') 并修改 $controller = new Controller()
  • @Ubersoldat 您使用的是什么版本的 Cake?我想我是为 2.0 写的
  • 此时最新:2.4
  • 谢谢,我会用这些更改更新答案:)
  • 在 2.8.5 上仍然有效,感谢您的工作回答 ;-)
【解决方案2】:

您导入到 Shell 中的内容应该是您的 Apps Lib 中的代码

该组件还可以使用 Lib 代码 - 但您无需执行大量繁琐的工作 如果你设置正确,你会让你的应用程序更干净

如果您导入组件,您需要将组件集合传递给它,因此您必须从 wtin shell 中制作它,而不是您使用它(或者如果您这样做,您一定做错了)

【讨论】:

  • 将公共代码从组件移动到 lib 文件夹中的 clas 工作。我仍然对哪些代码应该成为库的一部分以及哪些代码应该成为组件的一部分感到困惑
  • @Zulubaba 你有一些代码可以看到粘贴到 bin.cakephp.org 或粘贴到其他地方。我可以理解您的困惑,但除了说 Mark Story 的资产压缩可以做到这一点之外,我无法在没有看到代码的情况下进行详细说明。 Asset Compress 使用 shell 和 helper,它们都来自 Lib 的源类(两者都使用了特定于插件的额外配置方向)
【解决方案3】:

您是否尝试过文件顶部的App::uses('Component', 'Controller');,例如。在导入 CommonComponent 之前?然后我猜你需要按照 sam 所说的去做,或者你可以使用 $this-&gt;Controller-&gt;Components-&gt;load('CommonComponent') 但为此你需要构造 Controller 类。

【讨论】:

    【解决方案4】:

    我认为在控制器和外壳之间共享功能在语义上是错误的。

    如果您需要通用功能,将其放在一个单独的类中会更清晰、更整洁,将该类放在您的供应商文件夹中,然后将代码导入控制器和外壳。

    此外,这种方法不会阻止您创建使用核心功能的组件和任务,然后在控制器和外壳之间共享这些组件和任务。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-13
      • 2013-06-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-18
      • 1970-01-01
      相关资源
      最近更新 更多