Symfony 2.7.10でアセットを使用していて、コントローラーで画像のURLを生成したいのですが。
Symfonyのconfig.ymlファイルに次の設定を追加しました:
framework:
assets:
version: '311nk2'
version_format: '%%s?v=%%s'
base_path: /bundles/myBundleName
twigでは、URLの生成は問題なく動作するため、次のtwigコードで:
{{ asset('images/logo.png') }}
それは生成します:
/bundles/myBundleName/images/logo.png?v=311nk2
コントローラで同じURLを生成したいのですが、これはどのようにして可能ですか?
よし、この答えが時間の経過とともに少し注目されるのを見て、2つのことを指摘しておかなければならない。
コンテナーサービスを使用してSymfony 2.8.36のアセットURLを処理する方法:
public function indexAction(Request $request)
{
/** @var \Symfony\Bundle\FrameworkBundle\Templating\Helper\AssetsHelper $manager */
$manager = $this->get('templating.helper.assets');
return $this->render('default/index.html.twig', array(
'base_dir' => realpath($this->container->getParameter('kernel.root_dir').'/..').DIRECTORY_SEPARATOR,
'logo' => $manager->getUrl('bundles/myBundleName/images/logo.png'),
));
}
Symfony 3.4.6のアセットURLをコンテナサービスと新しいAutowire構成を使用して処理する方法:
public function indexAction(Request $request)
{
/** @var \Symfony\Component\Asset\Packages $manager */
$manager = $this->get('assets.packages');
return $this->render('default/index.html.twig', [
'base_dir' => realpath($this->getParameter('kernel.project_dir')).DIRECTORY_SEPARATOR,
'logo' => $manager->getUrl('bundles/myBundleName/images/logo.png'),
]);
}
そして
public function autowireAction(Request $request, \Symfony\Component\Asset\Packages $assetsManager)
{
return $this->render('default/index.html.twig', [
'base_dir' => realpath($this->getParameter('kernel.project_dir')).DIRECTORY_SEPARATOR,
'logo' => $assetsManager->getUrl('bundles/myBundleName/images/logo.png'),
]);
}
Autowire構成でのみSymfony 4.0のアセットURLを処理する方法:
public function indexAction(Request $request, \Symfony\Component\Asset\Packages $assetsManager)
{
$path = $assetsManager->getUrl('bundles/myBundleName/images/logo.png');
}
Symfony 4について知っておくべきことがいくつかあります:
composer require symfony/asset
を実行する必要があります。templating.helper.assets
と呼ばれるヘルパーサービスを使用すると、トリックを実行できます。次のようなものを試してください:
var_dump($this->get('templating.helper.assets')->getUrl('bundles/myBundleName/images/logo.png'));
自動配線でsymfony 3.4以降を使用している場合は、パッケージインスタンスをDIしてそれを使用できます。例えば、コントローラのアクション関数について言う:
public function myAction(Packages $assetPackage)
{
$url = $assetPackage->getUrl('css/main-ie.css');
}
しかし、symfony 3ではそれはもう機能していません。
Symfony 3で使う
$this->container->get('assets.packages')->getUrl($path);
例.
private function getAssets($path)
{
return $this->container->get('assets.packages')->getUrl($path);
}
$this->getAssets(...your path...);