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 中的文件系统组件获取文件内容?

Symfony2.8。如何从发布请求中获取数据

如何从 Symfony 中的 url 获取 id [重复]

Symfony 5:如何从路由规则中获取选项数据

如何在 PHP Symfony 4 中获取 POST 全局变量?

如何使用教义/symfony4 从数据库中获取(连接)两条记录