मैं एक सिम्फनी 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
के लिए निर्माण किया जाता है। पर क्यों?
कोई विचार क्या गलत हो सकता है?
सामान्य तौर पर, आप निर्माता में उपयोगकर्ता पाने के लिए नहीं करना चाहती। आपके ऑब्जेक्ट को बनने से पहले सुरक्षा घटक ने यह वास्तव में कभी नहीं किया है कि आप वास्तव में कभी नहीं जानते हैं। तो बस एक MyService :: getUser जोड़ें और जब भी इसकी आवश्यकता हो इसे कॉल करें। अपने आप को कुछ समय सिरदर्द बचाओ। – Cerad
कन्स्ट्रक्टर में टोकन स्टोरेज से बातचीत नहीं करते हैं, लेकिन केवल 'userHasPurchases'' विधि – Matteo