我想在到达应用程序之前打开一个新的浏览器窗口。
我必须说,在到达应用程序之前,有一个身份验证。如果身份验证是好的,它可能会转到DefaultController / indexAction。
首先,在我的DefaultController indexAction中我写了这个:
$session = $request->getSession();
$kernel = $this->get('kernel');
if($kernel->getEnvironment() === 'prod' && $session->has('full_screen')) {
$session->set('full_screen', 'done');
return $this->render('MyBundle::index.js.twig');
}
... the code of my action
index.js.twig中的,有以下代码:
<script type='text/javascript'>
var settings = "width=" +
(screen.width - (screen.width * 0.005)) + ", height=" +
((screen.height - (screen.height * 0.050))) +
" , top=0, left=0, scrollbars=yes, location=no, directories=no, status=no, \n\
menubar=no, toolbar=no, resizable=no, dependent=no";
window.open('', '_self', '');
window.close();
win = window.open('{{path('app_index')}}', 'APPLICATION_NAME', settings);
win.focus();
</script>
注意:route app_index转到DefaultController / indexAction
这很有效。
问题是代码在控制器的indexAction内。所以我决定使用beforeController事件来做。 所以indexAction中的代码就出来了。
我创建了一个界面:
interface IWindowController {
public function openWindowAction();
}
现在DefaultController实现了接口,我必须添加一个新方法'openWindowAction'就是这样:
public function openWindowAction() {
return $this->render('MyLBundle::index.js.twig');
}
我创建了一个这样的监听器:
class WindowListener {
private $kernel;
private $session;
function __construct($kernel, Session $session) {
$this->kernel = $kernel;
$this->session = $session;
}
public function onKernelController(FilterControllerEvent $event) {
$controller = $event->getController();
if($controller[0] instanceof IWindowController) {
if($this->kernel->getEnvironment() === 'dev' && !$this->session->has('full_screen')) {
$this->session->set('full_screen', 'done');
$controller[0]->openWindowAction();
}
}
}
}
将WindowListener添加到services.yml:
my.window.listener:
class: PATH\TO\WindowListener
arguments: [@kernel, @session]
tags:
- { name: kernel.event_listener, event: kernel.controller, method: onKernelController }
调试程序,它转到监听器,调用并转到控制器中的openWindowActionMethod。但它就像渲染不呈现任何东西。不会显示javascript中的提醒。
因此没有窗口打开,应用程序显示在同一窗口中。
为什么?我怎样才能使它发挥作用?
修改:
我修改了services.yml以添加twig引擎注入。
arguments: [@kernel, @session, @templating]
WindowListener中的修改构造函数。
private $kernel;
private $session;
private $twig_engine;
function __construct($kernel, Session $session, TwigEngine $templating) {
$this->kernel = $kernel;
$this->session = $session;
$this->twig_engine = $templating;
}
并修改了onKernelController方法的结尾
$this->session->set('full_screen', 'done');
//$controller[0]->openWindowAction();
return $this->twig_engine->render('MyBundle::index.js.twig');
什么都没发生。