在Symfony 2

时间:2016-06-23 08:36:16

标签: javascript symfony events

我想在到达应用程序之前打开一个新的浏览器窗口。

我必须说,在到达应用程序之前,有一个身份验证。如果身份验证是好的,它可能会转到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');

什么都没发生。

0 个答案:

没有答案