Rumah > Soal Jawab > teks badan
Saya telah menggunakan rangka kerja lain seperti TP dan CI untuk memenuhi keperluan di atas, dan ia boleh direalisasikan dengan mudah. Baru-baru ini, saya juga ingin melaksanakannya pada SF2 dan menulis adminBundle untuk membuat bahagian belakang secara automatik untuk menyediakan fungsi biasa. Namun, saya menghadapi masalah berikut:
Memandangkan saya ingin mengesan kebenaran akses pengguna secara global di latar belakang, saya mendengar pengawal Dapatkan maklumat permintaan sebelum setiap pengawal dicetuskan dan semak sama ada pengguna telah memberikan kebenaran yang sepadan. Kodnya adalah seperti berikut:
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>');
});
//。。。。。
Kemudian saya memperkenalkan 2 render dalam susun atur latar belakang Kod menu dan serbuk roti adalah seperti berikut:
<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>
Dengan cara ini, 2 sub_requests dimulakan, tetapi keperluan saya ialah mendapatkan url permintaan induk dalam sub_request untuk melaksanakan serbuk roti dan menu saya. Terdapat beberapa masalah dalam SF Seseorang mencadangkan untuk menggunakan tindanan permintaan dalam sub tindakan
/**
* 显示面包屑
* @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,
));
}
Saya cuba mendapatkan request_stack dalam tindakan di atas, tetapi sebaik sahaja saya mendapat, nampaknya permintaan telah dimulakan dalam tindakan ini, pendengar saya telah dicetuskan, dan kemudian dilaksanakan yang lain, melompat ke gesaan bahawa anda mempunyai kebenaran yang tidak mencukupi. Saya keliru dan tidak tahu mengapa.
伊谢尔伦2017-05-16 16:46:27
Pendengar yang memantau kernel.controller, menambah pertimbangan dan hanya menyemak kebenaran apabila permintaan utama dibuat:
if ($event->isMasterRequest()) {
// 才做检查
}
FilterControllerEvent dalam 2.3 tidak mempunyai kaedah ini, cuma rujuk logik ini dan tulis sendiri:
https://github.com/symfony/symfony/blob/2.7/src/Symfony/Component/HttpKernel/Event/KernelEvent.php #L100