symfony 4:如何从 RootDir 获取“/public”
Posted
技术标签:
【中文标题】symfony 4:如何从 RootDir 获取“/public”【英文标题】:symfony 4 : How to get "/public" from RootDir 【发布时间】:2018-07-13 02:34:19 【问题描述】:我在public
文件夹下有一张图片。
如何在 symfony4 中获取我的图像目录?
在 symfony 3 中,它相当于:
$webPath = $this->get('kernel')->getRootDir() . '/../web/';
【问题讨论】:
您好,欢迎来到 ***。请花一些时间阅读帮助页面,尤其是名为"What topics can I ask about here?" 和"What types of questions should I avoid asking?" 的部分。更重要的是,请阅读the Stack Overflow question checklist。您可能还想了解Minimal, Complete, and Verifiable Examples。 How do I read from parameters.yml in a controller in symfony2?的可能重复 【参考方案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
键中
【讨论】:
以上是关于symfony 4:如何从 RootDir 获取“/public”的主要内容,如果未能解决你的问题,请参考以下文章
如何通过 Symfony 4 中的文件系统组件获取文件内容?