在symfony中,如何在任何Controller中获取全局方法和变量?

时间:2016-11-10 04:59:42

标签: php symfony

场景是,客户端(我网站中的所有请求,如Ajax)将请求类似{"token":"mytoken"}的json字符串.PHP通过$request->getContent()json_decode接收它。我将它存储在一个名为$data的变量中,这样我就可以在任何Controller中获取它。

我还创建了一个按键获取值的方法,像

这样的代码
public function input($key, $default = '', $func = '')
{
    $ret = '';
    if (isset($this->data[$key])) {
        $ret = $this->data[$key];
    } else {
        return $default;
    }
    if (is_string($func)) {
        if (in_array($func, ['int', 'string', 'array'])) {
            settype($ret, $func);
            return $ret;
        }
        if ($func)
            $ret = call_user_func($func, $ret);
    } elseif (is_array($func)) {
        if ($func)
            $ret = call_user_func_array($func, [$ret]);
    }
    if (!$ret)
        return $default;
    return $ret;
}

虽然我可以将其注册到服务器,但我使用它$this->get('input')->input($mykey);,这将出现在任何控制器中。这是一个建议的解决方案? 问题只是我的头衔,怎么样?救救我。

2 个答案:

答案 0 :(得分:1)

考虑添加一个请求事件侦听器,该侦听器解析JSON并在请求对象中设置结果数据。示例实现:

<?php

use Symfony\Component\HttpKernel\Event\GetResponseEvent;

class ParseJsonRequestListener
{
    public function onKernelRequest(GetResponseEvent $event)
    {
        $request = $event->getRequest();

        // only parse the content body if the content type is JSON
        if (preg_match('/\bjson\b/', $request->getContentType())) {
            $parameters = json_decode($request->getContent(), true);

            if ($parameters) {
                $request->request->replace($parameters);
            }
        }
    }
}

注册监听器,例如在app / config / services.yml:

parse_json_request_listener:
    class: ParseJsonRequestListener
    tags:
        - { name: kernel.event_listener, event: kernel.request }

现在,在任何接收JSON请求的控制器中,您都可以从请求中获取已解析的JSON数据,例如:

<?php

$token = $request->request->get('token');

答案 1 :(得分:0)

如果方法在控制器中,那么您可以将$ request对象添加到params:

use Symfony\Component\HttpFoundation\Request;
//...
public function input(Request $request, $key, $default = '', $func = '')
//...

请求对象具有所有全局变量。更多信息:http://symfony.com/doc/current/introduction/http_fundamentals.html#symfony-request-object