Đối với một giải pháp chung để thực hiện mã trước mọi hành động điều khiển bạn có thể đính kèm một người biết lắng nghe sự kiện vào kernel.controller
sự kiện như vậy:
<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>
Sau đó, trong bạn BeforeControllerListener
bạn sẽ kiểm tra bộ điều khiển để xem nếu nó thực hiện một giao diện, nếu có, bạn sẽ gọi một phương thức từ giao diện và vượt qua trong giây ngữ cảnh thuần khiết.
<?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);
}
}
}
Sau đó, bất kỳ bộ điều khiển mà bạn muốn có người sử dụng luôn có sẵn, bạn sẽ chỉ thực hiện giao diện và thiết lập của người dùng như vậy:
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();
}
// ....
}
Giao diện là gì khác hơn là
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);
}
ai biết cách để viết các cấu hình trong yaml? chúng tôi sử dụng yaml và tôi không biết cách thêm 'đối số'. Tôi đọc này: http://symfony.com/doc/current/cookbook/service_container/event_listener.html cũng như không có sự giúp đỡ rõ ràng là – Toskan
@Toskan bạn chỉ có thể làm một cái gì đó như: 'arguments: [" @em "," @ some_service "]' – takeit
app.listener.constructor_listener: lớp: AppBundle \ EventListener \ ConstructorListener phạm vi: yêu cầu đối số: - {loại: dịch vụ, id: security.context} tags: - {name: kernel.event_listener , event: kernel.controller, phương thức: onKernelController} http://pastebin.com/NTySb68a – r4ccoon