18

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

我们需要做的就是实现getConsoleBannerandgetConsoleUsage方法和实现Zend\ModuleManager\Feature\ConsoleUsageProviderInterfaceorConsoleBannerProviderInterface接口。

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

在 Zend Framework 3 中,情况就不一样了。

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

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

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

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

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

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

以下是 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
4

2 回答 2

12

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

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

于 2016-08-29T13:51:02.277 回答
1

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

我写过不同的“单一文件”脚本,但最后,如果你的 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 应用程序(这里称为 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');
    }
}

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

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

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

于 2021-02-03T14:14:20.490 回答