在命令 symfony 3.4 上获取项目目录

Posted

技术标签:

【中文标题】在命令 symfony 3.4 上获取项目目录【英文标题】:Get project directory on command symfony 3.4 【发布时间】:2019-06-09 09:43:48 【问题描述】:

使用 symfony 3.4 在控制器中,我可以使用此方法获取项目目录:

$this->get('kernel')->getProjectDir()

我想在命令 symfony (3.4) 上获取项目目录,最好的做法是什么?

谢谢

【问题讨论】:

同样的方法,但最好将Kernel直接注入你的Command并从中调用getProjectDir() 加油@Flying,你比这更清楚。 【参考方案1】:

很确定这个问题已经被问过很多次了,但我懒得去搜索它。此外,Symfony 已经从从容器中提取参数/服务转向注入它们。所以我不确定以前的答案是否是最新的。

这很容易。

namespace AppBundle\Command;

use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Command\Command;

class ProjectDirCommand extends Command

    protected static $defaultName = 'app:project-dir';

    private $projectDir;

    public function __construct($projectDir)
    
        $this->projectDir = $projectDir;
        parent::__construct();
    
    protected function execute(InputInterface $input, OutputInterface $output)
    
        $output->writeln('Project Dir ' . $this->projectDir);
    

因为你的项目目录是一个字符串,autowire 不会知道要注入什么值。您可以将命令显式定义为服务并手动注入值,也可以使用绑定功能:

# services.yml or services.yaml
services:
    _defaults:
        autowire: true
        autoconfigure: true
        public: false
        bind:
            $projectDir: '%kernel.project_dir%' # matches on constructor argument name

【讨论】:

【参考方案2】:

您可以将KernelInterface注入到命令中,只需将其添加到构造函数参数中,然后使用$kernel->getProjectDir()获取项目目录:

<?php

namespace App\Command;

use Symfony\Component\Console\Command\Command;
use Symfony\Component\HttpKernel\KernelInterface;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

class FooCommand extends Command

    protected $projectDir;

    public function __construct(KernelInterface $kernel)
    
        parent::__construct();
        $this->projectDir = $kernel->getProjectDir();
    

    protected function execute(InputInterface $input, OutputInterface $output): int
    
        echo "This is the project directory: " . $this->projectDir;
        //...
    

【讨论】:

【参考方案3】:

好吧,我想说,直接在你的命令中注入 %kernel.project_dir%%kernel.root_dir% 参数。无需使您的命令依赖于内核服务。

顺便说一句,您还可以让您的 Command 扩展 Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand 这是一个抽象类。因此,您只需调用 getContainer 方法即可在命令中访问容器。

但是,我实际上不会建议您这样做。最好利用autowiring 或以“yaml”方式配置您的服务。

【讨论】:

ContainerAwareCommand 自 Sf 4.2 起已弃用,因此不应再使用它 是否也适用于 3.4?因为他没有使用4.2 不是,但今天编写显然需要在升级 Symfony 时更改的代码是没有意义的。通过不在新代码中使用已弃用的功能,您以后的工作量会减少 嗯,是的,但是在这种情况下,当你说话时要更准确,因为有些人可以理解它在 3.4 中也已被弃用,实际上它不是 我写得很清楚,自 4.2 起已弃用它

以上是关于在命令 symfony 3.4 上获取项目目录的主要内容,如果未能解决你的问题,请参考以下文章

Symfony 3.4 在我的包中使用视图

Symfony 更新 2.8 到 3.4

在 symfony 3.4 上安装 FOSUserBundle 时出错

从 Symfony 3.4 升级到 4:升级 symfony 时出错

路由在 Symfony 3.4 中不起作用

Symfony 3.4 - 如果在多对多关系上不存在,则持续存在