5

私は Symfony 2.7 WebApp に取り組んでいます。私が作成したバンドルの 1 つには、ユーザー関連のものを提供するサービスが含まれていますuserHasPurchases()

問題は、 a を含めるとTwig Extesion別のサービスが壊れることです:

AppShopサービス

namespace AppShopBundle\Service;

use AppBundle\Entity\User;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
...

class AppShopService {
    protected $user;

    public function __construct(TokenStorageInterface $tokenStorage, ...) {
        $this->user = $tokenStorage->getToken() ? $tokenStorage->getToken()->getUser() : null;
        ...
    }

    public function userHasPurchases(User $user) {
        $user = $user ? $user : $this->user;
        $result = $user...
        return result;
    }
}

AppShopBundle\Resources\config\services.yml

services:
    app_shop.service:
        class: AppShopBundle\Service\AppShopService
        arguments: 
            - "@security.token_storage"
            - ...

これまでのところ、すべて正常に動作しています。AppShopServices現在のユーザーで作成され、userHasPurchases()期待どおりに動作します。

これで、テンプレート内で使用できるようにTwig 拡張機能を追加しました。userHasPurchases()

小枝拡張

namespace AppShopBundle\Twig;

use AppShopBundle\Service\AppShopService;

class AppShopExtension extends \Twig_Extension {
    private $shopService;

    public function __construct(AppShopService $shopService) {
        $this->shopService = $shopService;
    }

    public function getName() {
        return 'app_shop_bundle_extension';
    }

    public function getFunctions() {
        $functions = array();

        $functions[] = new \Twig_SimpleFunction('userHasPurchases', array(
                $this,
                'userHasPurchases'
            ));

        return $functions;
    }

    public function userHasPurchases($user) {
        return $this->shopService->userHasPurchases($user);
    }
}

AppShopBundle\Resources\config\services.yml に拡張機能を含める

services:
    app_shop.service:
        class: AppShopBundle\Service\AppShopService
        arguments: 
            - "@security.token_storage"
            - ...

    app_shop.twig_extension:
        class: AppShopBundle\Twig\AppShopExtension
        arguments: 
          - "@app_shop.service"
        tags:
          - { name: twig.extension }

を含めた後Twig ExtensionAppShopServiceそのメソッドuserHasPurchasesは機能しなくなりました。問題は、 のコンストラクターが を返すようになったため、もうAppShopService設定されていないことです。user$tokenStorage->getToken()null

これはどのように可能ですか?を含む以外は何も変更していませんTwig ExtensionTwig Extensionすべてからを削除するとすぐに、services.yml再び正しく機能します。

私の唯一の推測は、Twig Extensionセキュリティの前に作成が行われるということです。しかし、なぜ?

ここで何が間違っているのでしょうか?

4

1 に答える 1

3

コンストラクターでは tokenStorage と対話せず、userHasPurchasesメソッド内でのみ対話します。

namespace AppShopBundle\Service;

use AppBundle\Entity\User;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
...

class AppShopService {
    protected $tokenStorage;

    public function __construct(TokenStorageInterface $tokenStorage, ...) {
        $this->tokenStorage = $tokenStorage;
    }

    public function userHasPurchases(User $user) {
        $user = $this->tokenStorage->getToken() ? $this->tokenStorage->getToken()->getUser() : null;
        $result = $user...
        return result;
    }
}

この助けを願っています

于 2016-04-21T13:00:25.983 に答える