5

私は以下のように拡張する1つのクラスを持ってい\Twig_Extensionます:

class MYTwigExtension extends \Twig_Extension
{

    protected $doctrine;

    protected $router;


    public function __construct(RegistryInterface $doctrine , $router)
    {
        $this->doctrine = $doctrine;
        $this->router = $router;

    }

    public function auth_links($user , $request)
    {
       // Some other codes here ...

       // HOW TO GENERATE $iconlink which is like '/path/to/an/image'

       $html .= "<img src=\"$iconlink\" alt=\"\" />  ";  

       echo $html;
    }

}

私の質問は、Twig Extension でアセット リンクを生成する方法です。クラスで ASSET ヘルパーの代わりが欲しいです。基本的に、ここで何を注入または使用する必要があるかわかりません! 前もって感謝します。

 <img src="{{ asset('img/icons/modules/timesheet.png') }}" alt="" /> 
4

5 に答える 5

17

templating.helper.assetsサービスを直接使用できます。

use Symfony\Component\DependencyInjection\ContainerInterface;

public function __construct(ContainerInterface $container)
{
    $this->container = $container;
}

次のように使用します。

$this->container->get('templating.helper.assets')->getUrl($iconlink);

この場合、twig 拡張機能をリクエスト スコープに入れることができないため、templating.helper.assetsだけを直接注入しても機能しません。ここのドキュメントを参照してください: https://symfony.com/doc/2.3/cookbook/service_container/scopes.html#using-a-service-from-a-narrower-scope

于 2012-06-14T18:32:13.407 に答える
7

依存性注入コンテナーを扱いたくありませんでした。これは私がしたことです:

use Twig_Environment as Environment;

class MyTwigExtension extends \Twig_Extension
{
    protected $twig;
    protected $assetFunction;

    public function initRuntime(Environment $twig)
    {
        $this->twig = $twig;
    }

    protected function asset($asset)
    {
        if (empty($this->assetFunction)) {
             $this->assetFunction = $this->twig->getFunction('asset')->getCallable();
        }
        return call_user_func($this->assetFunction, $asset);
    }

Twig_Extensionクラスコードを調べたところ、このinitRuntimeメソッドがカスタム拡張クラスでオーバーライドされていることがわかりました。を引数として受け取りTwig_Environmentます!このオブジェクトには、インスタンスgetFunctionを返すメソッドがあります。Twig_Function関数名 (この場合は ) を渡すだけですasset

Twig_FunctionオブジェクトにはメソッドgetCallableがあるので、最終的に呼び出し可能なasset関数を持つことができます。

asset独自の拡張クラスのメソッドを作成するために、もう少し進んでいます。それ以外の場所では、単純に呼び出して、テンプレート$this->asset()と同じ結果を得ることができます。{{ asset() }}

EDIT : キャッシュをクリアするときに at のgetFunction呼び出しでinitRuntimeスコープ例外がスローされます。そこで、カスタムassetメソッドに移動しました。それは正常に動作します。

于 2013-08-14T17:14:14.380 に答える
3

Symfony 2.8 のシンプルでクリーンな方法を次に示します。

services.yml:

app.twig_extension:
    class: Path\To\AcmeExtension
    arguments:
        assets: "@templating.helper.assets"

TWIG 拡張では:

use Symfony\Bundle\FrameworkBundle\Templating\Helper\AssetsHelper;

class AcmeExtension
{
    protected $assets;

    public function __construct(AssetsHelper $assets)
    {
        $this->assets = $assets;
    }
}

次に、次のように拡張機能の任意の関数で使用できます。

$this->assets->getUrl('myurl');
于 2016-04-10T16:17:36.987 に答える