Comment faire pour obtenir l'identifiant de eventlistener qui sont appelées à partir de l'AJAX
Je suis en utilisant symfony2 et FOSUserBundle.
Normalement,je peux obtenir des données utilisateur à partir du Contrôleur de
$user = $this->get('security.context')->getToken()->getUser();
ou
$user = $this->container->get('security.context')->getToken()->getUser();
Mais maintenant,je veux obtenir le userdata de eventlistner qui sont appelées à partir de l'Ajax.
Est-il possible? ou pas?
ma source, c'est ici.
namespace Acme\MemberBundle\EventListener;
use ADesigns\CalendarBundle\Event\CalendarEvent;
use ADesigns\CalendarBundle\Entity\EventEntity;
use Doctrine\ORM\EntityManager;
class CalendarEventListener
{
private $entityManager;
public function __construct(EntityManager $entityManager)
{
$this->entityManager = $entityManager;
}
public function loadEvents(CalendarEvent $calendarEvent)
{
$startDate = $calendarEvent->getStartDatetime();
$endDate = $calendarEvent->getEndDatetime();
$user = $this->container->get('security.context')->getToken()->getUser();//it doesnt work
//load events using your custom logic here,
//for instance, retrieving events from a repository
$companyEvents = $this->entityManager->getRepository('UserBundle:MutorSche')
->createQueryBuilder('company_events')
->where('company_events.event_datetime BETWEEN :startDate and :endDate')
->setParameter('startDate', $startDate->format('Y-m-d H:i:s'))
->setParameter('endDate', $endDate->format('Y-m-d H:i:s'))
->getQuery()->getResults();
foreach($companyEvents as $companyEvent) {
//create an event with a start/end time, or an all day event
if ($companyEvent->getAllDayEvent() === false) {
$eventEntity = new EventEntity($companyEvent->getTitle(), $companyEvent->getStartDatetime(), $companyEvent->getEndDatetime());
} else {
$eventEntity = new EventEntity($companyEvent->getTitle(), $companyEvent->getStartDatetime(), null, true);
}
//optional calendar event settings
$eventEntity->setAllDay(true); //default is false, set to true if this is an all day event
$eventEntity->setBgColor('#FF0000'); //set the background color of the event's label
$eventEntity->setFgColor('#FFFFFF'); //set the foreground color of the event's label
$eventEntity->setUrl('http://www.google.com'); //url to send user to when event label is clicked
$eventEntity->setCssClass('my-custom-class'); //a custom class you may want to apply to event labels
//finally, add the event to the CalendarEvent for displaying on the calendar
$calendarEvent->addEvent($eventEntity);
}
}
}
selon @nifr les conseils de.
J'ai changé un peu dans ma source cordon
class CalendarEventListener
{
private $entityManager;
private $container;//add
public function __construct(
EntityManager $entityManager,
ContainerInterface $container)//add
{
$this->entityManager = $entityManager;
$this->container = $container;//add
}
puis j'ai envie de passer à la deuxième argument de eventlistner.
Je suis à l'aide de services.xml pour faire de l'auditeur.
Comment puis-je ajouter un deuxième argument en faveur de cette?
<?xml version="1.0" encoding="UTF-8" ?>
<container xmlns="http://symfony.com/schema/dic/services">
<services>
<service id="acme.memberbundle.calendar_listener" class="Acme\MemberBundle\EventListener\CalendarEventListener">
<argument type="service" id="doctrine.orm.entity_manager" />
<tag name="kernel.event_listener" event="calendar.load_events" method="loadEvents" />
</service>
</services>
</container>
- Accepter l'autre solution (ayant plus upvotes), car il est plus proche de la philosophie de Symfony
Vous devez vous connecter pour publier un commentaire.
Vous avez besoin d'injecter du récipient au moyen d' L'Injection De Dépendance dans votre classe écouteur pour l'accès c'.
Lire plus à ce sujet dans le chapitre de livre.
Bien que l'injection de l'ensemble du conteneur de la performance est sage de ne pas la meilleure idée avec d'autres raisons comme la testabilité ( vous devriez normalement injecter les services dont vous avez besoin dans votre classe plutôt que sur le contenant )...
...dans votre cas, si vous n'êtes pas à l'aide d'un UserCallable vous obtiendrez une référence circulaire lors de l'injection de
@security.context
.Donc la solution la plus rapide est d'injecter le conteneur et le réglage de votre auditeur constructeur:
<argument type="service" id="container" />
mais vous n'avez pas besoin de deux arguments dans votre cas ... vous pouvez obtenir un entityManager à partir du conteneur aswell ...$this->entityManager = $container->get('doctrine.orm.entity_manager')
dans le constructeur.De Symfony 2.6 ce problème devrait être résolu. Une demande d'extraction a été accepté dans le maître. Votre problème est décrit ici.
https://github.com/symfony/symfony/pull/11690
De Symfony 2.6, on peut injecter le
security.token_storage
à votre écoute. Ce service permettra de contenir le jeton comme utilisé par leSecurityContext
dans <=2.5. Dans la version 3.0 de ce service remplacera leSecurityContext::getToken()
tout à fait. Vous pouvez voir un changement de base liste ici: http://symfony.com/blog/new-in-symfony-2-6-security-component-improvements#deprecated-the-security-context-serviceExemple d'utilisation de la 2.6:
Votre configuration:
Votre Auditeur
Être sûr de ne pas avoir le
Symfony profiler/toolbar
allumé. Je ne sais pas pourquoi, mais qui a fait$this->container->get('security.context')->getToken()
retournull
à chaque fois.Dans le fichier,
config_dev.yml
assurez-vous que le suivant est défini: