web-dev-qa-db-ja.com

Symfonyコントローラーでアセット画像のURLを取得する方法

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を生成したいのですが、これはどのようにして可能ですか?

14
Tom

よし、この答えが時間の経過とともに少し注目されるのを見て、2つのことを指摘しておかなければならない。

  • この回答は、SO=にバージョンベースのタグ付けがまだあるときに追加され、質問は最初にSf2に追加されました
  • それ以来、状況はかなり変わったので、答えを拡張します

コンテナーサービスを使用して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を実行する必要があります。

2016年3月22日時点の元の回答

templating.helper.assetsと呼ばれるヘルパーサービスを使用すると、トリックを実行できます。次のようなものを試してください:

var_dump($this->get('templating.helper.assets')->getUrl('bundles/myBundleName/images/logo.png'));
25
Artamiel

自動配線でsymfony 3.4以降を使用している場合は、パッケージインスタンスをDIしてそれを使用できます。例えば、コントローラのアクション関数について言う:

public function myAction(Packages $assetPackage)
{
   $url = $assetPackage->getUrl('css/main-ie.css');
}
11
runawaycoin

しかし、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...);
6
B. Godoak