读取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。从更大的角度来看,注入整个容器一直被认为是一种有点反模式的行为,这种行为是可以容忍的,因为它使生活变得更简单。有点像一个有钱但讨厌的叔叔。但是,这个问题相当棘手