【问题标题】:symfony 4 : How to get "/public" from RootDirsymfony 4:如何从 RootDir 获取“/public”
【发布时间】:2018-07-13 02:34:19
【问题描述】:

我在public 文件夹下有一张图片。
如何在 symfony4 中获取我的图像目录?
在 symfony 3 中,它相当于:

$webPath = $this->get('kernel')->getRootDir() . '/../web/';

【问题讨论】:

标签: symfony symfony4 symfony5


【解决方案1】:

你可以使用任何一个

$webPath = $this->get('kernel')->getProjectDir() . '/public/'; 

或者参数%kernel.project_dir%

$container->getParameter('kernel.project_dir') . '/public/';

【讨论】:

  • 值得一提的是,控制器需要扩展 Symfony\Bundle\FrameworkBundle\Controller\Controller 类,而不是您在大多数示例 Symfony\Bundle\FrameworkBundle\Controller\AbstractController 中找到的抽象类跨度>
  • 值得一提的是@CarlosDelgado,您提到的控制器类在 Symfony 4.2 中已被弃用 @deprecated since Symfony 4.2, use {@see AbstractController} instead.
【解决方案2】:

在 config/services.yaml 中:

parameters:
    webDir: '%env(DOCUMENT_ROOT)%'

在您的控制器中:

use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;

...

public function yourFunction(Parameterbag $parameterBag)
{
   $webPath = $parameterBag->get('webDir')
}

如果您需要访问公共目录,请将最后一行更改为以下内容:

$webPath = $parameterBag->get('webDir') . '/your/path/from/the/public/dir/'

【讨论】:

  • 向 Symfony 4 及更高版本前进,这更接近真正的答案。 $this->get('kernel') 在 4.2 中已弃用。
【解决方案3】:

在Controller中(也继承AbstractController):

$projectDir = $this->getParameter('kernel.project_dir');

【讨论】:

  • 你为什么不赞成这个?这是唯一对我有用的吗?!
  • @godrar 因为我们讨论的是 Symfony 4,因此您的控制器应该被定义为服务,而不是从 AbstractController 继承。
  • @vdavid 是的,它适用于旧版本。在新版本中,您无法以这种方式访问​​内核(注入“容器”是不好的做法)
【解决方案4】:

如果您不在控制器中,注入整个 container 只是为了访问参数是一种不好的做法。只需像这样自动连接ParameterBagInterface

protected $parameterBag;

public function __construct(ParameterBagInterface $parameterBag)
{
    $this->parameterBag = $parameterBag;

}

然后像这样访问您的参数(在本例中为项目目录),

$this->parameterBag->get('kernel.project_dir');

希望有人会觉得这很有帮助。

干杯。

【讨论】:

    【解决方案5】:

    您可以将KernelInterface 注入服务或其他任何东西,然后使用$kernel->getProjectDir() 获取项目目录:

    <?php
    
    namespace App\Service;
    
    use Symfony\Component\HttpKernel\KernelInterface;
    
    class Foo
    {
        protected $projectDir;
    
        public function __construct(KernelInterface $kernel)
        {
            $this->projectDir = $kernel->getProjectDir();
        }
    
        public function showProjectDir()
        {
            echo "This is the project directory: " . $this->projectDir;
        }
    }
    

    【讨论】:

      【解决方案6】:

      Symfony 4.3 开始,我们可以使用新 Symfony\Component\HttpFoundation\UrlHelper 类的 getAbsoluteUrl()getRelativePath() 两种方法为给定路径生成绝对(和相对) URL。

      New in Symfony 4.3: URL Helper

      public function someControllerAction(UrlHelper $urlHelper)
      {
          // ...
          return [
              'avatar' => $urlHelper->getAbsoluteUrl($user->avatar()->path()),
              // ...
          ];
      }
      

      【讨论】:

        【解决方案7】:

        以上所有答案似乎都有效,但我认为如果将其配置为services.yaml 中的参数会更简单

        如果需要在多个服务中使用,可以这样绑定:

        # services.yaml
        
        services:
          _defaults:
            autowire: true
            autoconfigure: true
            bind:
              $publicDir: "%kernel.project_dir%/public"
        
        # src/Services/MyService.php
        
        class MyService
        {
            public function __construct(
                 private string $publicDir,
            ) {
            }
        
            // …
        }
        

        这样,它只在一个地方配置,如果以后你决定把/public改成别的东西,你只需要在.yaml文件中改变它。

        如果您不需要根目录而是子目录,最好定义最终目标路径:这样如果您以后只需要移动该目录,您将更加灵活,例如$imageDir 或@ 987654326@(取决于您是使用完整目录还是仅使用公共路径)。

        还要注意默认的public 路径在composer.json 文件中定义,在extra.public-dir 键中

        【讨论】:

          猜你喜欢
          • 2019-04-06
          • 1970-01-01
          • 2021-09-27
          • 1970-01-01
          • 2019-02-18
          • 2019-07-20
          • 1970-01-01
          • 2018-12-20
          • 2019-02-08
          相关资源
          最近更新 更多