Für eine allgemeine Lösung protokolliert, bevor jeder Controller-Aktion Sie einen Ereignis-Listener die anhängen kernel.controller
Ereignis wie folgt:
<service id="your_app.listener.before_controller" class="App\CoreBundle\EventListener\BeforeControllerListener" scope="request">
<tag name="kernel.event_listener" event="kernel.controller" method="onKernelController"/>
<argument type="service" id="security.context"/>
</service>
Dann in Ihrem BeforeControllerListener
werden Sie den Controller überprüfen, um zu sehen, ob es eine Schnittstelle implementiert, wenn es der Fall ist, werden Sie eine Methode aus der Schnittstelle aufrufen und übergeben in der Sekunde Kontext.
<?php
namespace App\CoreBundle\EventListener;
use Symfony\Component\HttpKernel\Event\FilterControllerEvent;
use Symfony\Component\Security\Core\SecurityContextInterface;
use App\CoreBundle\Model\InitializableControllerInterface;
/**
* @author Matt Drollette <[email protected]>
*/
class BeforeControllerListener
{
protected $security_context;
public function __construct(SecurityContextInterface $security_context)
{
$this->security_context = $security_context;
}
public function onKernelController(FilterControllerEvent $event)
{
$controller = $event->getController();
if (!is_array($controller)) {
// not a object but a different kind of callable. Do nothing
return;
}
$controllerObject = $controller[0];
// skip initializing for exceptions
if ($controllerObject instanceof ExceptionController) {
return;
}
if ($controllerObject instanceof InitializableControllerInterface) {
// this method is the one that is part of the interface.
$controllerObject->initialize($event->getRequest(), $this->security_context);
}
}
}
Dann werden alle Controller, die Sie den Benutzer haben wollen immer verfügbar Sie werden nur diese Schnittstelle implementieren und den Benutzer festgelegt wie folgt:
use App\CoreBundle\Model\InitializableControllerInterface;
class DefaultController implements InitializableControllerInterface
{
/**
* Current user.
*
* @var User
*/
private $user;
/**
* {@inheritdoc}
*/
public function initialize(Request $request, SecurityContextInterface $security_context)
{
$this->user = $security_context->getToken()->getUser();
}
// ....
}
Die Schnittstelle ist nichts anderes als
namespace App\CoreBundle\Model;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Security\Core\SecurityContextInterface;
interface InitializableControllerInterface
{
public function initialize(Request $request, SecurityContextInterface $security_context);
}
jemand den Weg kennen die schreiben Konfiguration in Yaml? Wir benutzen Yaml, und ich weiß nicht, wie man das 'Argument' hinzufügt. Ich lese dies: http://symfony.com/doc/current/cookbook/service_container/event_listener.html auch ohne Hilfe offensichtlich – Toskan
@Toskan Sie können nur etwas tun wie: 'Argumente: [" @em "," @ some_service "]' – takeit
app.listener.constructor_listener: Klasse: AppBundle \ Eventlistener \ ConstructorListener -umfang: Anfrage Argumente: - {type: Service, ID: security.context} tags: - {name: kernel.event_listener , Ereignis: kernel.controller, Methode: onKernelController} http://pastebin.com/NTySb68a – r4ccoon