Heim > Fragen und Antworten > Hauptteil
Ich habe andere Frameworks wie TP und CI verwendet, um die oben genannten Anforderungen zu erfüllen, und dies ist leicht zu realisieren. Kürzlich möchte ich es auch auf SF2 implementieren und ein adminBundle schreiben, um automatisch ein Backend zu erstellen, das allgemeine Funktionen bereitstellt. Allerdings bin ich auf folgendes Problem gestoßen:
Da ich Benutzerzugriffsberechtigungen global im Hintergrund erkennen möchte, habe ich vor dem Auslösen jedes Controllers die Anforderungsinformationen abgehört und überprüft, ob der Benutzer die entsprechenden Berechtigungen erteilt hat. Der Code lautet wie folgt:
class RunActListener {
protected $securityContext;
public function __construct(SecurityContextInterface $securityContext)
$this->securityContext = $securityContext;
}
public function onRunAct(FilterControllerEvent $event) {
$request = $event->getRequest();
$ajax = $request->isXmlHttpRequest();
if (preg_match('/^\/admin/', $request->getRequestUri())) {
$routeName = $request->get('_route');
if ($this->securityContext->isGranted(array($routeName))) {
} else {
$reffeer = $request->server->get('HTTP_REFERER');
$data['info'] = '您没有权限操作!';
$data['status'] = false;
if ($ajax) {
$event->setController(
function() use ($data) {
return new JsonResponse($data);
});
} else {
$event->setController(
function() use ($data) {
return new Response('<b>您没有足够的访问权限!</b><script>setTimeout("window.history.back(-1)",2000)</script>');
});
//。。。。。
Dann habe ich 2 Renderings im Hintergrundlayout eingeführt. Die Menü- und Breadcrumb-Codes lauten wie folgt:
<nav id="navigation" class="collapse">
<ul>
{{ render(controller( 'CwpUtilBundle:Menu:showMenu')) }}
</ul>
</nav>
</aside>
<p id="sidebar-separator"></p>
<section id="main" class="clearfix">
<p id="main-header" class="page-header">
{{ render(controller( 'CwpUtilBundle:Menu:showCrumb')) }}
</p>
<p id="main-content">
{% block main %}
{% endblock %}
</p>
</section>
Auf diese Weise werden zwei Unteranfragen initiiert, aber meine Anforderung besteht darin, die URL der übergeordneten Anfrage in der Unteranfrage abzurufen, um meine Breadcrumbs und mein Menü zu implementieren. Es gibt einige Probleme in SF. Jemand hat vorgeschlagen, den Anforderungsstapel in der Unteraktion abzurufen
/**
* 显示面包屑
* @return type
*/
public function showCrumbAction() {
$request = $this->container->get('request');
$path = $request->server->get('REDIRECT_URL');
$path_arr = explode('/', $path);
$path_len = count($path_arr);
$top_index = (int) ($path_len - 2);
$path_top = $path_arr[$top_index];
$route_arr = $this->get('router')->match($path);
$route = $route_arr['_route'];
$em = $this->getDoctrine()->getManager();
//获取菜单结果集
$top_menu = $em->getRepository('CwpUtilBundle:Menu')->findOneByNode($path_top);
$sec_menu = $em->getRepository('CwpUtilBundle:Menu')->findOneByNode($route);
return $this->render('CwpUtilBundle:Layout:crumb.html.twig', array(
'top_menu' => $top_menu,
'sec_menu' => $sec_menu,
));
}
Ich habe versucht, request_stack in der obigen Aktion abzurufen, aber sobald ich es bekomme, scheint es, dass in dieser Aktion eine Anfrage initiiert wurde, mein Listener ausgelöst und dann anders ausgeführt wurde, was zur Meldung führt, dass Sie nicht über ausreichende Berechtigungen verfügen. Ich war verwirrt und wusste nicht warum. 伊谢尔伦2017-05-16 16:46:27
监听kernel.controller的那个listener,加个判断,仅在主请求时才检查权限就可以了:
if ($event->isMasterRequest()) {
// 才做检查
}
2.3的FilterControllerEvent没这个方法,参考这个逻辑自己写就可以了:
https://github.com/symfony/symfony/blob/2.7/src/Symfony/Component/HttpKernel/Event/KernelEvent.php#L100