在我的论坛中,我有一个Resources/public/images/image.jpg
文件。
此图片可通过http://localhost/bundles/mybundle/images/image.jpg
如何从控制器获取此/bundles/mybundle
前缀?
我希望能够生成公共文件的路径,而无需硬编码/bundles/mybundle
前缀。
答案 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);
}
}
没什么特别的,但是通常的服务
的 @ 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';