读取Symfony 3.4 getParameter null中的参数

读取Symfony 3.4 getParameter null中的参数,symfony,Symfony,我无法从控制器中的parameters.yml读取参数 我想这样做: //My Controller class ExampleController extends Controller { function someMethod($argument) { dump($this->getParameter('free_proxy'));die(); 在parameters.yml中,我得到: parameters: free_proxy: "htt

我无法从控制器中的
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"
我得到一个错误:
调用null上的成员函数getParameter()

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

编辑:另外,我尝试了以下方法:

services:
    _defaults:
        autowire: true
        autoconfigure: true
        public: false
        bind:
          $freeProxy: '%free_proxy%'
然后使用:

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

但是我得到了一个错误:
未使用的绑定“$freeProxy”在服务中…

文档显示如下:

parameters.yml :
parameters:
    mailer.transport: sendmail
设置:

$container->setParameter('mailer.transport', 'sendmail');
要获得:

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

文件显示如下:

parameters.yml :
parameters:
    mailer.transport: sendmail
设置:

$container->setParameter('mailer.transport', 'sendmail');
要获得:

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

这里有两个谜团。首先是为什么容器没有被注入,这反过来会导致getParameter失败。第二,为什么bind会产生未使用的绑定错误

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

$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%'
并开始获取那些未使用的绑定错误。事实证明bind对动作注入不起作用。不太清楚为什么。我不经常使用它,但我真的希望只需将$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。构造函数注入在这两个版本中都可以正常工作。

因此这里有两个谜团。首先是为什么容器没有被注入,这反过来会导致getParameter失败。第二,为什么bind会产生未使用的绑定错误

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

$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%'
并开始获取那些未使用的绑定错误。事实证明bind对动作注入不起作用。不太清楚为什么。我不经常使用它,但我真的希望只需将$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。构造函数注入在这两个版本中都可以正常工作。

随着autowire的引入,情况发生了一些变化。对于一些建议的方法。或者查阅容器文档,了解如何将容器注入控制器。@Cerad我尝试过类似的解决方案。我不明白,为什么这么复杂。在Laravel中是ENV.free_proxy,仅此而已。对于symonfy 3.4、3.3和2.8以上(也就是symfony 3.3和3.4),我已经阅读了不同的解释。很多事情在你第一次处理它们时看起来很复杂,但过了一段时间它们就变成了例行公事。只需将$freeProxy绑定到您的值,然后只需在action方法中命名一个变量$freeProxy。从更大的角度来看,注入整个容器一直被认为是一种有点反模式的行为,这种行为是可以容忍的,因为它使生活变得更简单。有点像一个有钱但讨厌的叔叔。但是,全新的autowire功能使消除容器变得更加实用。我可以补充一点,配置和注入服务/参数是Symfony的关键基石之一。花点时间去理解是非常值得的。我将使用
services.yml
编辑我的答案以获得更多帮助,因为它对我不起作用。随着autowire的引入,情况发生了一些变化。对于一些建议的方法。或者查阅容器文档,了解如何将容器注入控制器。@Cerad我尝试过类似的解决方案。我不明白,为什么这么复杂。在Laravel中是ENV.free_proxy,仅此而已。对于symonfy 3.4、3.3和2.8以上(也就是symfony 3.3和3.4),我已经阅读了不同的解释。很多事情在你第一次处理它们时看起来很复杂,但过了一段时间它们就变成了例行公事。只需将$freeProxy绑定到您的值,然后只需在action方法中命名一个变量$freeProxy。从更大的角度来看,注入整个容器一直被认为是一种有点反模式的行为,这种行为是可以容忍的,因为它使生活变得更简单。有点像一个有钱但讨厌的叔叔。但是,这个问题相当棘手