24

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

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

7 回答 7

32

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

protected $parameterBag;

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

}

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

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

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

干杯。

于 2019-08-07T11:56:58.443 回答
28

你可以使用

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

或者参数%kernel.project_dir%

$container->getParameter('kernel.project_dir') . '/public/';
于 2018-02-02T15:02:31.433 回答
9

In Controller (also with inheriting AbstractController):

$projectDir = $this->getParameter('kernel.project_dir');
于 2019-03-21T09:02:47.443 回答
5

在 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/'
于 2019-02-01T12:54:20.860 回答
4

您可以注入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;
    }
}
于 2020-01-10T19:24:53.300 回答
1

以上所有答案似乎都有效,但我认为如果将其配置为参数会更简单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$imagePath(取决于您是否使用完整目录或仅公共路径)。

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

于 2021-11-24T15:19:58.743 回答
1

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

Symfony 4.3 中的新功能:URL 助手

public function someControllerAction(UrlHelper $urlHelper)
{
    // ...
    return [
        'avatar' => $urlHelper->getAbsoluteUrl($user->avatar()->path()),
        // ...
    ];
}
于 2021-04-08T16:08:12.290 回答