我无法从控制器中的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...
答案 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');