5

symfony2 を使用しています。次のように、別のクラス (コントローラー) からメソッドを呼び出そうとするリスナー クラスがあります。

        $authenticate = new AuthenticationController();
        $authenticate->isTokenValid($token);

そしてコントローラ isTokenValid メソッド:

public function isTokenValid($token) {

    $conn = $this->get('database_connection');

エラーをスローしています

Fatal error: Call to a member function get() on a non-object in /home/content/24/9254124/html/newsite/vendor/symfony/symfony/src/Symfony/Bundle/FrameworkBundle/Controller/Controller.php on line 246

コントローラーメソッドを適切な方法で(URLでルーティングを使用して)ロードすると、正常に機能します。

4

2 に答える 2

7

Symfony2は依存性注入パターンを使用します。すべてのサービス(データベース接続など)を保持するコンテナーを注入する必要があります。

$authenticate = new AuthenticationController();
$authenticate->setContainer($this->container);
$authenticate->isTokenValid($token);

もちろん、ここではあなたのリスナークラスはContainerAware

[+]リスナーをContainerAwareにするには、リスナーに渡します@service_container(サンプルフォームservices.yml

my.listener:
    class: ACME\MyBundle\ListenerController
    arguments: [ @service_container ]
    tags:
        - { name: kernel.event_listener, event: kernel.controller, method: onKernelController }
    kernel.event_listener:
        event: kernel.controller

次に、リスナークラスのコンストラクターで:

public function __construct($container = null){
    $this->container = $container;
}
于 2012-10-15T23:15:59.963 に答える
4

@dev-null-dweller が示唆しているのは悪い習慣であるため、別の回答を追加します。ほとんどの場合、コンテナ全体ではなく、必要なサービスのみを注入することをお勧めします。

use Doctrine\DBAL\Connection;

public function __construct(Connection $connection)
{
    $this->connection = $connection;
}
my_listener:
    arguments: [ @database_connection ]
于 2012-10-16T06:29:17.517 に答える