Php Symfony 5从控制台命令生成URL

Php Symfony 5从控制台命令生成URL,php,symfony,symfony5,Php,Symfony,Symfony5,我是Symfony的新手,正在使用5.x。我已经使用Symfony\Component\Console\command\command创建了一个控制台命令,并且正在尝试使用Symfony\Component\HttpClient\HttpClient发布到URL。我需要生成在同一台机器上运行的路由的URL(但将来可能会更改为另一台机器),因此主机可能类似于localhost或example.com,并且API的端口是自定义的。我在网上搜索过,但唯一可能的解决方案是使用Symfony\Compon

我是Symfony的新手,正在使用5.x。我已经使用Symfony\Component\Console\command\command创建了一个控制台命令,并且正在尝试使用Symfony\Component\HttpClient\HttpClient发布到URL。我需要生成在同一台机器上运行的路由的URL(但将来可能会更改为另一台机器),因此主机可能类似于localhost或example.com,并且API的端口是自定义的。我在网上搜索过,但唯一可能的解决方案是使用Symfony\Component\Routing\Generator\UrlGeneratorInterface,网页上塞满了Symfony旧版本的代码示例,我还没有成功实现这一点

我最近的尝试是:

public function __construct(UrlGeneratorInterface $router)
{
    parent::__construct();
    $this->router = $router;
}
但我真的不明白如何将参数UrlGeneratorInterface$router注入构造函数。我得到一个错误,没有提供参数。我是否必须在别处创建UrlGenerator实例并将其注入此处,或者是否有一种更简单的方法从命令中生成Symfony中的绝对URL?我还不太懂容器

$url = $context->generate('view', ['Param' => $message['Param']], UrlGeneratorInterface::ABSOLUTE_URL);
services.yaml:

App\Command\MyCommand:
    arguments: ['@router.default']
Symfony\Component\Routing\RouterInterface:
    arguments: ['@router']
  • 有没有一种更简单的方法通过以下命令从控制台生成URL 明确指定主机、协议、端口、路由、参数等
  • 为什么UrlGeneratorInterface或RouterInterface不自动连接
  • 是否需要在中手动将布线指定为$router.default services.yaml是否还启用了自动布线
  • 我理解执行功能的实现可能是 不正确,但我无法在没有得到 建造师正在工作。这项工作仍在进行中
  • 编辑: 更新要点:

    编辑2:通过添加问题点使问题陈述更清晰:我在上面睡着了:)

    编辑3:

    #!/usr/bin/env php
    <?php
    // application.php
    
    require __DIR__.'/vendor/autoload.php';
    
    use Symfony\Component\Console\Application;
    
    $application = new Application();
    
    $application->add(new App\Command\MyCommand());
    
    $application->run();
    
    #/usr/bin/env-php
    
    我仔细研究了你的要点,发现以下几点可行:

    您似乎遇到的问题不是由于您的服务声明,而是您缺少
    MyCommand
    private$router
    变量的声明

    因此,您可以保留
    services.yaml
    ,如您在gist中所示,不需要更改autowire变量,也不需要手动声明命令

    此外,您不需要从路由器获取
    $context
    ,您还可以设置,在这里您可以找到我在哪里找到的


    请注意,我从execute中删除了一些代码,这是因为我无法访问您的其他文件。您只需重新添加即可。

    好吧,解决这个问题并不那么简单。很多文档已经过时或者没有完全解决这个问题。到目前为止,我得到的是:

    services.yaml:

    App\Command\MyCommand:
        arguments: ['@router.default']
    
    Symfony\Component\Routing\RouterInterface:
        arguments: ['@router']
    
    application.php:

    #!/usr/bin/env php
    <?php
    // application.php
    
    require __DIR__.'/vendor/autoload.php';
    require __DIR__.'/src/Kernel.php';
    
    use Symfony\Bundle\FrameworkBundle\Console\Application;
    use Symfony\Component\Routing\RouterInterface;
    use Symfony\Component\Dotenv\Dotenv;
    
    $dotenv = new Dotenv();
    $dotenv->load(__DIR__.'/.env', __DIR__.'/.env.local');
    
    $kernel = new App\Kernel(getenv('APP_ENV'), getenv('APP_DEBUG'));
    $kernel->boot();
    
    $container = $kernel->getContainer();
    
    $application = new Application($kernel);
    
    $application->add(new App\Command\MyCommand($container->get('router')));
    
    $application->run();
    
    #/usr/bin/env-php
    
    啊,我想我现在更明白了。通过
    bin/console
    运行的每个命令都会通过与应用程序的“面向web”端相同的内核。因此,在功能上,这是同一个服务容器。尝试接受
    RouterInterface
    而不是
    UrlGeneratorInterface
    ,原因是您正在传递
    @router
    通常为控制台和web创建单个项目,将它们放在一起的原因是共享逻辑、实体和配置。此错误的另一个原因可能是您启用了自动布线。在services.yaml 1/2 anks中,响应@MattSmeets时应处于默认状态。我尝试了RouterInterface,但仍然得到相同的错误:未捕获的ArgumentCounter错误:函数App\Command\MyCommand的参数太少::\uu construct(),已传递0。。。我确实启用了自动布线,但我希望可以保持启用状态。我尝试在services.yaml中显式地为MyCommand配置提供autowire:false,但没有任何更改您可以找到当前版本的手册。如果您的响应@msg使用<5.1Thanks,则需要以另一种方式配置请求上下文。Symfony 5.1.0(环境:dev,调试:true)。我已经试过了。基本上和马特·斯梅茨建议的一样?我刚才又试了一次来确定,结果还是一样的错误。(我删除了services.yaml中的显式连接,希望它能自动连接)我没有配置routing.yaml,但这应该不是问题,对吗?这意味着我应该得到本地主机?我只是不明白为什么不是自动布线。。。我正在使用Windows 10 btw。是的,您应该获得
    http://localhost/
    但是如果您想将其更改为
    example.com
    ,正如您在问题中所说的,您需要明确地配置它。symfony命令对vhost一无所知,因为它在服务器上下文之外运行。很抱歉,当我尝试它时,它在到达private$router的分配之前失败。我想这就是我错过的原因。我仍然收到的错误是Uncaught ArgumentCounter错误:函数App\Command\MyCommand:的参数太少::\uu construct(),传递了0。。。这意味着构造函数不会被调用。当我运行php bin/console debug:autowiring时,会列出Symfony\Component\Routing\RouterInterface(router.default)。我会丢失一个必需的包裹吗?我从symfony/skeleton开始,并根据需要添加了包。仅供参考,我正在Windows 10 x64 2004上使用PHP7.4.6。您的services.yaml控制器是否与此处完全相同:?抱歉,没有尽快响应。。。我有点忙于其他事情,但我想我已经解决了问题。我想是这样的:$application->add(newapp\Command\MyCommand());在application.php中。我用它来调用命令。你知道怎么解决吗?我将在编辑中共享代码…也许您会发现这很有用