运行命令行Phalcon应用程序时发生未知错误

时间:2018-09-10 22:46:55

标签: php phalcon

我正在尝试运行命令行任务,而我的cli.php文件却给我这个错误:

PHP Notice:  Array to string conversion in /var/www/htdocs/classschedule/app/cli.php on line 23
PHP Fatal error:  Uncaught RuntimeException: Call to undefined method ::gettaskname() in /var/www/htdocs/classschedule/app/cli.php:23
Stack trace:
#0 /var/www/htdocs/classschedule/app/cli.php(23): Phalcon\Cli\Console->handle(Array)
#1 {main}
  thrown in /var/www/htdocs/classschedule/app/cli.php on line 23

这是我的cli.php

include '/var/www/common/dump.php';
require 'config/bootstrap.php';

$DI->get('dispatcher')->setDefaultNamespace('Task');
$DI->get('dispatcher')->setNamespaceName('Task');

$Console = new \Phalcon\CLI\Console();
$Console->setDI($DI);

$arguments = [];
foreach($argv as $k => $arg) {
    if($k == 1) {
        $arguments['task'] = $arg;
    } elseif($k == 2) {
         $arguments['action'] = $arg;
    } elseif($k >= 3) {
        $arguments['params'][] = $arg;
    }
}

try{
    $Console->handle($arguments); // <-- This is line 23
}
catch(\Phalcon\Exception $e){
    echo $e->getMessage();
    exit(255);
}

我不知道为什么会生成“通知”或“致命”错误。该文件与我拥有的另一个应用程序的cli.php几乎相同,可以正常运行。即使取出foreach()仍然会导致错误。

修改:

Bootstrap.php

Config.php


已解决

解决方案:

我的DI,Dispatcher和Router都是MVC版本,而不是等效的CLI。更改它们可以解决问题-调度程序中应该使用setTask()

2 个答案:

答案 0 :(得分:1)

能否请您共享config/bootstrap.php文件?我测试过:

use Phalcon\Di\FactoryDefault\Cli as DI;

已读取参数,并且第23行要求输入MainTask handler class(无错误)。

这是我测试过的代码:

use Phalcon\Loader;
use Phalcon\Di\FactoryDefault\Cli as CliDI;

$DI = new CliDI();

$loader = new Loader();

$loader->registerNamespaces(
    [
    'Task' => __DIR__ . '/tasks',
    ]
);
$loader->register();

$Console = new \Phalcon\CLI\Console();
$Console->setDI($DI);

$arguments = [];

foreach($argv as $k => $arg) {
    if($k == 1) {
        $arguments['task'] = $arg;
    } elseif($k == 2) {
        $arguments['action'] = $arg;
    } elseif($k >= 3) {
        $arguments['params'][] = $arg;
    }
}

try{
    $Console->handle($arguments); 
}
catch(\Phalcon\Exception $e){
    echo $e->getMessage();
    exit(255);
}

还有MainTask.php:        

namespace Task;

use Phalcon\Cli\Task;

class MainTask extends Task
{
    public function mainAction()
    {
        echo 'This is the default task and the default action' . PHP_EOL;
    }

    public function testAction(array $params)
    {
        echo sprintf('hello %s', $params[0]);

        echo PHP_EOL;

        echo sprintf('best regards, %s', $params[1]);

        echo PHP_EOL;    

    }

}

答案 1 :(得分:-1)

$Console->handle($arguments); // <-- This is line 23

这行似乎需要一个字符串,而您正在传递一个数组。

也许phalcon无法很好地处理这种情况,并且无法实例化其他试图对其调用gettaskname的对象。