如何创建 ZF3 控制台应用程序

在 Zend Framework 2 中,将初始模块横幅添加到控制台应用程序非常简单。

我们所需要的只是实现 和 方法并实现 or 接口。getConsoleBannergetConsoleUsageZend\ModuleManager\Feature\ConsoleUsageProviderInterfaceConsoleBannerProviderInterface

这足以在通过 CLI 启动时将这些消息转储到控制台中。public/index.php

在Zend Framework 3中,情况并不相同。

执行相同的设置不会提供相同的结果。实际上,在控制台中,我们看到骨架应用程序的默认html页面的方式与通过浏览器访问它的方式相同。

在我们安装自定义模块之前,正在查看该页面:以下是该模块的文档 https://zendframework.github.io/zend-mvc-console/intro/zend-mvc-console

即使按照建议安装模块(在模块定义中添加),控制台横幅也不会显示。我已经在方法中进行了var转储测试,并且能够查看数据,因此框架执行这些方法,但在控制台中没有显示任何结果。'Zend\Mvc\Console'

我已经使用控制台路由和控制器进行了测试。找到路由,执行控制器操作,但 cli 中不再显示任何内容。

我已经挖掘了框架的代码,似乎该类从未执行过。Zend\Mvc\Console\ResponseSender\ConsoleResponseSender

我是否必须注册一些策略才能在 CLI 中显示某些内容?view_manager

以下是 zf3 骨架应用程序顶部的源:https://gist.github.com/kachar/06f0c9096bcc1cc0b00f4612aed1b68b

运行应用:

$ php -v
PHP 7.0.6 (cli) (built: Apr 27 2016 14:00:40) ( ZTS )
Copyright (c) 1997-2016 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2016 Zend Technologies

$ php public/index.php
Application\Module::getConsoleBanner
Application\Module::getConsoleUsage

$ php public/index.php user
Application\Controller\IndexController::indexAction

答案 1

根据我们自己的文档,不推荐使用 MVC <>控制台集成。我们建议使用 zf 控制台symfony 控制台为您的应用程序构建控制台功能。

我们已知悉 zend-mvc-console 存在的问题,我们将很快发布补丁版本来解决这些问题,这将解决您的短期问题。但是,我们建议长期迁移到其他解决方案。


答案 2

对于任何决定使用zend框架3(或laminas)并一起使用(如前所述)@weierophinney 的人,我建议使用zend框架官方论坛 https://discourse.laminas.dev/t/how-to-launch-a-basic-php-cli/1473/11(作者rieschl)的这个答案。我将代码从那里复制到这里:symfony/console

我编写了不同的“单文件”脚本,但最终,如果您的cli脚本不断发展,symfony/console是最好的。而且它的设置非常容易。我所做的是让 ServiceManager 创建 Symfony 控制台应用程序,所以我的 CLI 入口点(在 bin/console 上)如下所示:

#!/usr/bin/env php
<?php

declare(strict_types=1);

use Laminas\Mvc\Application as ZfApp;
use Symfony\Component\Console\Application as ConsoleApp;

chdir(dirname(__DIR__));

require dirname(__DIR__) . '/vendor/autoload.php';

$zfApp = ZfApp::init(require dirname(__DIR__) . '/config/application.config.php');
/** @var ConsoleApp $consoleApp */
$consoleApp = $zfApp->getServiceManager()->get(ConsoleApp::class);
return $consoleApp->run();

正如你所看到的,我构建了Laminas App(这里称为ZfApp,它是Laminas之前),从那里获取ServiceManager,从ServiceManager获取Symfony控制台。服务工厂如下所示

<?php

declare(strict_types=1);

namespace Eventjet\Factory;

use Psr\Container\ContainerInterface;
use Symfony\Component\Console\Application;
use Symfony\Component\Console\Command\Command;

final class ConsoleApplicationFactory
{
    public function __invoke(ContainerInterface $container): Application
    {
        $app = new Application(
            'Eventjet Console Legacy System',
            '1.0'
        );
        foreach ($this->createCommands($container) as $command) {
            $app->add($command);
        }
        return $app;
    }

    /**
     * @return Command[]
     */
    private function createCommands(ContainerInterface $container): array
    {
        $commandNames = $this->config($container)['ej-console']['commands'];
        return array_map(
            static function (string $commandName) use ($container) {
                return $container->get($commandName);
            },
            $commandNames
        );
    }

    /**
     * @return mixed[]
     */
    private function config(ContainerInterface $container): array
    {
        return $container->get('config');
    }
}

这样,我就可以创建一个新的 Console 类,在配置中在 ['ej-console']['commands'] 配置键下注册为类字符串,并立即使用它 :slight_smile:配置看起来像这样:

return [
    'ej-console' => [
        'commands' => [
            SomeCommand::class,
        ],
    ],
];

这个答案帮助我在一天之内开始使用zf3。symfony/console


推荐