-2

Symfony 5 中的控制台命令有问题。

我尝试在构造函数的命令(TerytWMRODZRepository $terytwmrodzrepo)中传递一个参数,因为我想连接数据库和 exec 查询。一种方法是为实体创建存储库,我这样做了。但是当我将参数放入构造函数的命令时,我有错误。

下面代码这个控制台的命令:

# src/Command/GetNewDataTerytCommand.php
# ...
<?php

namespace App\Command;

use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Httpfoundation\Response;
use App\TERYT_SoapClient;
use App\Service\DB\TerytDB;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\Console\Command\LockableTrait;
use App\Repository\TerytWMRODZRepository;

class GetNewDataTerytCommand extends Command
{
    protected static $wsdl = 'https://uslugaterytws1test.stat.gov.pl/wsdl/terytws1.wsdl';

    private $terytwmrodzrepo;

    protected static $defaultName = 'teryt:get';

    public function __construct(TerytWMRODZRepository $terytwmrodzrepo){

        $this->terytwmrodzrepo= $terytwmrodzrepo;

        parent::__construct();
    }
    ...
}

当我在终端中使用控制台命令时:'php bin/console teryt:get',我的输出如下:


参数计数错误 {#67

  #message: "Too few arguments to function App\Command\GetNewDataTerytCommand::__construct(), 0 passed in /var/www/html/umowy_uzytkownicy/bin/console on line 43 and exactly 1 expected"<br />
  #code: 0<br />
  #file: "./src/Command/GetNewDataTerytCommand.php"<br />
  #line: 27<br />
  trace: {<br />
    ./src/Command/GetNewDataTerytCommand.php:27 {<br />
      App\Command\GetNewDataTerytCommand->__construct(TerytWMRODZRepository $terytwmrodzrepo)<br />
      › <br />
      › public function __construct(TerytWMRODZRepository $terytwmrodzrepo){<br />
      › <br />
    }<br />
    ./bin/console:43 { …}<br />
  }<br />
}<br /><br />

我尝试在 url 上的文档 Symfony 5中找到解决方案: https ://symfony.com/doc/current/console/commands_as_services.html和其他页面,例如:https ://ourcodeworld.com/articles/read/1131/how-to -access-the-entity-manager-doctrine-inside-a-command-in-symfony-5 但没有任何效果。

我尝试在config/service.yaml中将控制台的命令配置为服务,但没有任何改变:

# config/services.yaml
# ...
services:
    ...
    App\Command\GetNewDataTerytCommand:
        public: true
        tags:
           - { name: 'console.command', command: 'teryt:get'}

PS:我为我的英语道歉。这是我在 StackOverFlow 中的第一个问题。

非常感谢

4

1 回答 1

0

Symfony 控制台命令类定义$name在构造函数中需要一个参数(可以为空)。然后必须将该名称传递回parent::__construct($name);调用。

如果该命令不需要任何依赖注入服务(将添加到本地构造函数中),则__constructor()可以省略类中的方法定义以使其回退到Command它所扩展的类。

class BotDataIpRangesCommand extends Command
{
    protected static $defaultName = 'app:local:command-name';
    // other class fields

    public function __construct(MessageBusInterface $commandBus, string $name = null)
    {
        parent::__construct($name);
        $this->commandBus = $commandBus;
    }
    // other methods, including `configure()` & `execute()`
    // ...
于 2020-03-13T13:40:29.123 回答