2016-04-21 4 views
5

मैं एक सिम्फनी 2.7 वेब ऐप पर काम कर रहा हूं। मेरे द्वारा बनाए गए बंडलों में से एक ऐसी सेवा शामिल है जो कुछ उपयोगकर्ता से संबंधित सामान प्रदान करती है, उदा। userHasPurchases()सिम्फनी ट्विग एक्सटेंशन अन्य सेवा तोड़ता है - सुरक्षा से पहले templating किया गया है?

समस्या यह है कि एक Twig Extesion निकालने सहित किसी अन्य सेवा:

AppShopService

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 \ संसाधन \ config \ services.yml

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

अब तक सब कुछ ठीक काम करता है: AppShopServices वर्तमान उपयोगकर्ता के साथ बनाया गया है और userHasPurchases() अपेक्षित काम करता है। AppShopBundle \ संसाधन \ config \ सेवाओं में विस्तार भी शामिल है

टहनी एक्सटेंशन

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); 
    } 
} 

:

अब मैं एक टहनी एक्सटेंशन जोड़ने मेरे टेम्पलेट के भीतर userHasPurchases() उपयोग करने में सक्षम होना चाहिए। 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 Extension, AppShopService और इसकी विधि userHasPurchases icluding के बाद और काम नहीं करता है। समस्या यह है कि AppShopService का निर्माता user सेट नहीं करता है क्योंकि $tokenStorage->getToken() अब null लौटाता है।

यह कैसे संभव है? मैंने Twig Extension को छोड़कर कुछ भी नहीं बदला है। जैसे ही मैं Twig Extension को services.yml से हटा देता हूं, सब ठीक से फिर से काम करता है।

मेरा एकमात्र अनुमान यह है कि किसी भी सुरक्षा से पहले Twig Extension के लिए निर्माण किया जाता है। पर क्यों?

कोई विचार क्या गलत हो सकता है?

+1

सामान्य तौर पर, आप निर्माता में उपयोगकर्ता पाने के लिए नहीं करना चाहती। आपके ऑब्जेक्ट को बनने से पहले सुरक्षा घटक ने यह वास्तव में कभी नहीं किया है कि आप वास्तव में कभी नहीं जानते हैं। तो बस एक MyService :: getUser जोड़ें और जब भी इसकी आवश्यकता हो इसे कॉल करें। अपने आप को कुछ समय सिरदर्द बचाओ। – Cerad

+1

कन्स्ट्रक्टर में टोकन स्टोरेज से बातचीत नहीं करते हैं, लेकिन केवल 'userHasPurchases'' विधि – Matteo

उत्तर

3

कन्स्ट्रक्टर में टोकन स्टोरेज से बातचीत नहीं करते हैं, लेकिन केवल 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; 
    } 
} 

आशा इस मदद

+0

में बहुत बहुत धन्यवाद! यह वास्तव में समस्या हल करता है। पर क्यों? मैं समझता हूं कि समय एक मुद्दा हो सकता है, लेकिन सुरक्षा/templating/आदि async किया गया है? मैं '$ this-> उपयोगकर्ता = $ this-> टोकन स्टोरेज-> getToken() का उपयोग करता हूं? $ this-> टोकन स्टोरेज-> getToken() -> getUser(): null; 'कई अन्य सेवाओं में भी, बिना किसी समस्या के। इस मामले में इतना खास क्या है? –

+0

hi @AndreiHerford यह सेवा के जीवन चक्र पर निर्भर करता है लेकिन मुझे इस समय इसके बारे में कोई संसाधन नहीं मिला है।आम तौर पर जब मैं इसकी ज़रूरत होती हूं, तब सेवा के साथ बातचीत करता हूं, और कभी भी सेवा के निर्माता में नहीं, इसलिए सेवा स्टेटलेस हो सकती है (म्यूटेबल कॉल एट्रिब्यूट से बचें)। उममीद है कि इससे मदद मिलेगी – Matteo

संबंधित मुद्दे