获取指定包中的图像路径

时间:2014-01-09 10:29:35

标签: symfony

在我的论坛中,我有一个Resources/public/images/image.jpg文件。

此图片可通过http://localhost/bundles/mybundle/images/image.jpg

访问

如何从控制器获取此/bundles/mybundle前缀? 我希望能够生成公共文件的路径,而无需硬编码/bundles/mybundle前缀。

3 个答案:

答案 0 :(得分:4)

我会创建一个可以执行此操作的服务

创建服务

此类的主要职责是获取任何资源的任何包的默认Web路径。
根据{{​​3}}命令的定义,对于给定的/bundles/foobar/

,每个捆绑包的相对路径应为FooBarBundle

的Acme \ FooBundle \ WebPathResolver

use Symfony\Component\HttpKernel\Bundle\BundleInterface;

class WebPathResolver
{
    /**
     * Gets the prefix of the asset with the given bundle
     *
     * @param BundleInterface $bundle Bundle to fetch in
     *
     * @throws \InvalidArgumentException
     * @return string Prefix
     */
    public function getPrefix(BundleInterface $bundle)
    {
        if (!is_dir($bundle->getPath().'/Resources/public')) {
            throw new \InvalidArgumentException(sprintf(
                'Bundle %s does not have Resources/public folder',
                $bundle->getName()
            ));
        }

        return sprintf(
            '/bundles/%s',
            preg_replace('/bundle$/', '', strtolower($bundle->getName()))
        );
    }

    /**
     * Get path
     *
     * @param BundleInterface $bundle   Bundle to fetch in
     * @param string          $type     Which folder to fetch in (image, css..)
     * @param string          $resource Resource (image1.png)
     *
     * @return string Resolved path
     */
    public function getPath(BundleInterface $bundle, $type, $resource)
    {
        $prefix = $this->getPrefix($bundle);

        return sprintf('%s/%s/%s', $prefix, $type, $resource);
    }
}

在service.yml

中声明它

没什么特别的,但是通常的服务

@ AcmeFooBundle /资源/配置/ services.yml

services:
    acme_foo.webpath_resolver:
        class: Acme\FooBundle\WebPathResolver

用法

然后你就可以在你的控制器中使用它了

的Acme \ FooBundle \控制器\ BarController :: bazAction

$bundle = $this->get('http_kernel')->getBundle('AcmeFooBundle');
$path   = $this->get('acme.webpath_resolver')->getPath($bundle, 'image', 'foo.png');

echo $path; // Outputs /bundles/acmefoo/image/foo.png

答案 1 :(得分:1)

您可以在模板中使用资源,例如:

{% image '@AcmeFooBundle/Resources/public/images/example.jpg' %}
    <img src="{{ asset_url }}" alt="Example" />
{% endimage %}

或直接在src:

<img src="{{ asset('@AcmeFooBundle/Resources/public/images/example.jpg') }}" alt="Example" />

在css文件中,您需要使用相对路径。

从控制器,您可以通过以下方式获得完整路径:

$this->container->get('templating.helper.assets')->getUrl('@AcmeFooBundle/Resources/public/images/example.jpg');

答案 2 :(得分:0)

您可以使用类似的东西,但假设路径是小写的包名称。

    $controller = $request->attributes->get('_controller');
    $regexp = '/(.*)\\\Bundle\\\(.*)\\\Controller\\\(.*)Controller::(.*)Action/';
    preg_match($regexp, $controller, $matches);
    $imagePath = '/bundles/'. strtolower($matches[2]). '/images/image.jpg';