54

この質問は、変数を symfony2 のグローバル ヘルパー関数 (サービス) に渡すことができない理由を理解していないことから始まりましたが、私より頭の良い人たちのおかげで、私のエラーは、セキュリティ コンテキストを渡さないクラス内から security_context を使用しようとしたことであることに気付きました。注射はしないので...

これが最終結果であり、機能するコードです。これをコミュニティに役立てるためのより良い方法は見つかりませんでした。

これは、symfony2 のグローバル関数またはヘルパー関数内から security_context からユーザーおよびその他のデータを取得する方法です。

私は次のクラスと関数を持っています:

<?php
namespace BizTV\CommonBundle\Helper;

use Symfony\Component\DependencyInjection\ContainerInterface as Container;

class globalHelper {    

private $container;

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

    //This is a helper function that checks the permission on a single container
    public function hasAccess($container)
    {
        $user = $this->container->get('security.context')->getToken()->getUser();

        //do my stuff
    }     
}

...このように(app/config/config.ymlで)サービスとして定義されています...

#Registering my global helper functions            
services:
  biztv.helper.globalHelper:
    class: BizTV\CommonBundle\Helper\globalHelper
    arguments: ['@service_container']

さて、コントローラーでこの関数を次のように呼び出します...

public function createAction($id) {

    //do some stuff, transform $id into $entity of my type...

    //Check if that container is within the company, and if user has access to it.
    $helper = $this->get('biztv.helper.globalHelper');
    $access = $helper->hasAccess($entity);
4

5 に答える 5

85

プロパティとコンストラクターを追加する前に、最初のエラー (未定義のプロパティ) が発生したと仮定します。次に、2番目のエラーが発生しました。この他のエラーは、コンストラクターが Container オブジェクトを受け取ることを期待しているが、何も受け取っていないことを意味します。これは、サービスを定義したときに、コンテナーを取得する必要があることを Dependency Injection マネージャーに伝えていないためです。サービス定義を次のように変更します。

services:
  biztv.helper.globalHelper:
    class: BizTV\CommonBundle\Helper\globalHelper
    arguments: ['@service_container']

コンストラクターは、Symfony\Component\DependencyInjection\ContainerInterface 型のオブジェクトを期待する必要があります。

use Symfony\Component\DependencyInjection\ContainerInterface as Container;

class globalHelper {    

    private $container;

    public function __construct(Container $container) {
        $this->container = $container;
    }
于 2012-08-21T14:26:43.267 に答える
26

OO のベスト プラクティスではないにもかかわらず、常に機能するアプローチ

global $kernel;
$assetsManager = $kernel->getContainer()->get('acme_assets.assets_manager');‏
于 2014-04-01T21:40:57.833 に答える
8

もう 1 つのオプションは、ContainerAware を拡張することです。

use Symfony\Component\DependencyInjection\ContainerAware;

class MyService extends ContainerAware
{
    ....
}

setContainerこれにより、サービス宣言で呼び出すことができます。

foo.my_service:
    class: Foo\Bundle\Bar\Service\MyService
    calls:
        - [setContainer, [@service_container]]

その後、次のようにサービスでコンテナーを参照できます。

$container = $this->container;
于 2015-10-24T13:37:26.320 に答える