2

Symfony2 では、デフォルトで無効になっている Twig モジュールがいくつかあります。{% debug %}それらの 1 つは、タグを追加するデバッグ拡張機能です (開発環境で役立ちます)。

それを有効にするには、特に難しいことはありません。このサービスを構成に追加します。

  debug.twig.extension:
    class: Twig_Extensions_Extension_Debug
    tags:
      - { name: 'twig.extension' }

しかし、{% sandbox %}タグを有効にする方法は?

私の問題は、拡張機能のコンストラクターがセキュリティポリシーを取ることです:

public function __construct(Twig_Sandbox_SecurityPolicyInterface $policy, $sandboxed = false)
{
    $this->policy            = $policy;
    $this->sandboxedGlobally = $sandboxed;
}

twigのドキュメントを読むことで、 (Symfony2 なしで) ネイティブにそれを行う方法を見ました:

$tags = array('if');
$filters = array('upper');
$methods = array(
    'Article' => array('getTitle', 'getBody'),
);
$properties = array(
    'Article' => array('title', 'body'),
);
$functions = array('range');
$policy = new Twig_Sandbox_SecurityPolicy($tags, $filters, $methods, $properties, $functions);
$sandbox = new Twig_Extension_Sandbox($policy);
$twig->addExtension($sandbox);

サンドボックスを使用する直前に、サービス内でそのようなことを行うことができますが、これは、慣れ親しんだ依存性注入ほど明確ではありません。

Symfony2 で twig のサンドボックス拡張機能を有効にするより適切な方法はありますか?

4

1 に答える 1

7

セキュリティ ポリシーのプライベート サービスを作成してみませんか。

parameters:
    twig.sandbox.tags:
        - if
    twig.sandbox.filters:
        - upper
    twig.sandbox.methods:
        Article: [getTitle, getBody]
    twig.sandbox.properties:
        Article: [title, body]
    twig.sandbox.functions:
        - range

twig.sandbox.policy:
    class: Twig_Sandbox_SecurityPolicy
    arguments:
        - %twig.sandbox.tags%
        - %twig.sandbox.filters%
        - %twig.sandbox.methods%
        - %twig.sandbox.properties%
        - %twig.sandbox.functions%
    public: false

次に、このサービスをサービスに挿入できtwig.sandbox.extensionます。

twig.sandbox.extension:
    class: Twig_Extension_Sandbox
    arguments:
        - @twig.sandbox.policy
    tags:
        - { name: twig.extension }

終わり。プライベートをマークするtwig.sandbox.policyと、コンテナーを使用してアクセスできなくなります (他のサービスに注入することはできますが、それは問題ではないと思います)。

免責事項: 私はこれをテストしておらず、実際に機能する前におそらく微調整が必​​要なので、コピーして貼り付けないでください!

于 2013-04-17T23:11:08.140 に答える