symfony 4:如何从 RootDir 获取“/public”
symfony 4 : How to get "/public" from RootDir
我在 public
文件夹下有一张图片。
如何在 symfony4 中获取我的图像目录?
在 symfony 3 中,它等价于:
$webPath = $this->get('kernel')->getRootDir() . '/../web/';
您可以使用其中之一
$webPath = $this->get('kernel')->getProjectDir() . '/public/';
或参数%kernel.project_dir%
$container->getParameter('kernel.project_dir') . '/public/';
在config/services.yaml:
parameters:
webDir: '%env(DOCUMENT_ROOT)%'
在你的控制器中:
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
...
public function yourFunction(Parameterbag $parameterBag)
{
$webPath = $parameterBag->get('webDir')
}
如果您需要访问 public 中的目录,请将最后一行更改为以下内容:
$webPath = $parameterBag->get('webDir') . '/your/path/from/the/public/dir/'
在 Controller 中(也继承了 AbstractController):
$projectDir = $this->getParameter('kernel.project_dir');
如果您不在控制器中,注入整个 container
只是为了访问参数是一种不好的做法。像这样自动连接 ParameterBagInterface
,
protected $parameterBag;
public function __construct(ParameterBagInterface $parameterBag)
{
$this->parameterBag = $parameterBag;
}
然后像这样访问您的参数(在本例中为项目目录),
$this->parameterBag->get('kernel.project_dir');
希望有人会觉得这有用。
干杯。
您可以将 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;
}
}
从 Symfony 4.3 开始,我们可以使用 getAbsoluteUrl()
和 getRelativePath()
的两种方法为给定路径生成绝对(和相对)URL新 Symfony\Component\HttpFoundation\UrlHelper
class.
New in Symfony 4.3: URL Helper
public function someControllerAction(UrlHelper $urlHelper)
{
// ...
return [
'avatar' => $urlHelper->getAbsoluteUrl($user->avatar()->path()),
// ...
];
}
以上所有答案似乎都有效,但我认为如果将其配置为 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 路径)。
另请注意,默认 public
路径在 composer.json
文件中定义,在 extra.public-dir
键
中
我在 public
文件夹下有一张图片。
如何在 symfony4 中获取我的图像目录?
在 symfony 3 中,它等价于:
$webPath = $this->get('kernel')->getRootDir() . '/../web/';
您可以使用其中之一
$webPath = $this->get('kernel')->getProjectDir() . '/public/';
或参数%kernel.project_dir%
$container->getParameter('kernel.project_dir') . '/public/';
在config/services.yaml:
parameters:
webDir: '%env(DOCUMENT_ROOT)%'
在你的控制器中:
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
...
public function yourFunction(Parameterbag $parameterBag)
{
$webPath = $parameterBag->get('webDir')
}
如果您需要访问 public 中的目录,请将最后一行更改为以下内容:
$webPath = $parameterBag->get('webDir') . '/your/path/from/the/public/dir/'
在 Controller 中(也继承了 AbstractController):
$projectDir = $this->getParameter('kernel.project_dir');
如果您不在控制器中,注入整个 container
只是为了访问参数是一种不好的做法。像这样自动连接 ParameterBagInterface
,
protected $parameterBag;
public function __construct(ParameterBagInterface $parameterBag)
{
$this->parameterBag = $parameterBag;
}
然后像这样访问您的参数(在本例中为项目目录),
$this->parameterBag->get('kernel.project_dir');
希望有人会觉得这有用。
干杯。
您可以将 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;
}
}
从 Symfony 4.3 开始,我们可以使用 getAbsoluteUrl()
和 getRelativePath()
的两种方法为给定路径生成绝对(和相对)URL新 Symfony\Component\HttpFoundation\UrlHelper
class.
New in Symfony 4.3: URL Helper
public function someControllerAction(UrlHelper $urlHelper)
{
// ...
return [
'avatar' => $urlHelper->getAbsoluteUrl($user->avatar()->path()),
// ...
];
}
以上所有答案似乎都有效,但我认为如果将其配置为 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 路径)。
另请注意,默认 public
路径在 composer.json
文件中定义,在 extra.public-dir
键