从Symfony 3.4中的参数读取getParameter null

时间:2019-01-02 15:47:05

标签: symfony

我无法从控制器中的parameters.yml中读取参数。

我想这样做:

//My Controller
class ExampleController extends Controller
{
    function someMethod($argument)
    {
        dump($this->getParameter('free_proxy'));die();

并在parameters.yml中得到:

parameters:
    free_proxy: "http://xxx:8080"

我收到一个错误:Call to a member function getParameter() on null

我已经测试了一些解决方案,例如添加一些服务以及使用get和stuff,但没有任何效果。

编辑:而且,我尝试了这个:

services:
    _defaults:
        autowire: true
        autoconfigure: true
        public: false
        bind:
          $freeProxy: '%free_proxy%'

然后使用:

$this->container->getParameter('free_proxy');

但是我收到一个错误:Unused binding "$freeProxy" in service...

2 个答案:

答案 0 :(得分:1)

所以这里有两个奥秘。首先是为什么不注入容器而又导致getParameter失败的原因。其次,为什么绑定会产生未使用的绑定错误。

您没有显示您的路线,但我怀疑您实际上在路线的某个地方:

$exampleController = new ExampleController();

如果是,则这说明了getParameter失败的原因。您确实需要让Symfony根据路由创建控制器。否则,不会注入容器,并且会跳过其他控制器魔术。

我使用旧的目录结构安装了一个全新的3.4应用程序,并添加了一个参数

composer create-project symfony/framework-standard-edition s34

# app/config/parameters.yml
parameters:
    free_proxy: "http://xxx:8080"

然后我使用默认路由注释对默认控制器进行了调整:

class DefaultController extends Controller
{
    /**
     * @Route("/", name="homepage")
     */
    public function indexAction(Request $request)
    {
        $freeProxy = $this->getParameter('free_proxy');

        // replace this example code with whatever you need
        return $this->render('default/index.html.twig', [
            'base_dir' => realpath($this->getParameter('kernel.project_dir')).DIRECTORY_SEPARATOR.$freeProxy,
        ]);
    }
}

一切都按预期进行。 Symfony请求处理程序负责注入容器,从而使您可以访问参数。如果您无法解决此问题,请使用路由信息更新您的问题。

然后,我查看了绑定问题。您确实想注入这些参数而不是拉出它们。我更新了services.yml

# app/config/services.yml
services:
    bind:
        $freeProxy: '%free_proxy%'

并开始获取那些未使用的绑定错误。事实证明,绑定不适用于动作注入。不太确定为什么。我用的不多,但我确实希望将$ freeProxy添加到您的操作方法中会起作用。无论如何,这是正确处事方式的有效示例。

class ExampleController extends Controller
{
    private $freeProxy;

    public function __construct($freeProxy)
    {
        $this->freeProxy = $freeProxy;
    }
    /**
     * @Route("/example", name="example")
     */
    function someMethod()
    {
        dump($this->freeProxy);
        dump($this->getParameter('free_proxy'));die();
    }
}

然后我进入了一个新的4.2项目并尝试了动作注入:

class IndexController extends AbstractController
{
    public function index($freeProxy)
    {
        return new Response("Index $freeProxy");
    }
}

动作注入按预期对4.2起作用,但对3.4不起作用。无论哪种版本,构造函数注入都可以正常工作。

答案 1 :(得分:0)

文档显示如下:

parameters.yml :
parameters:
    mailer.transport: sendmail

设置:

$container->setParameter('mailer.transport', 'sendmail');

获取:

$container->getParameter('mailer.transport');