【发布时间】:2014-11-27 06:50:45
【问题描述】:
我已经开始学习 Symfony2。我遇到了一个疑问:如果我有这条路线:
# app/config/routing.yml
hello:
path: /hello/{name}
defaults: { _controller: AcmeHelloBundle:Hello:index }
还有这个控制器:
// src/Acme/HelloBundle/Controller/HelloController.php
namespace Acme\HelloBundle\Controller;
use Symfony\Component\HttpFoundation\Response;
class HelloController
{
public function indexAction($name)
{
return new Response('<html><body>Ciao '.$name.'!</body></html>');
}
}
在 Symfony2 内部(在 app/bootstrap.php.cache 内)调用调用 user_func_array() PHP 内置函数:
$arguments = $this->resolver->getArguments($request, $controller);
$response = call_user_func_array($controller, $arguments);
并且对 getArguments() 方法的调用返回一个参数数组以传递给 action 方法。但如果控制器是:
// src/Acme/HelloBundle/Controller/HelloController.php
namespace Acme\HelloBundle\Controller;
use Symfony\Component\HttpFoundation\Response;
class HelloController
{
public function indexAction($n)
{
return new Response('<html><body>Ciao '.$n.'!</body></html>');
}
}
Symfony 会抱怨 RuntimeException,因为没有设置参数 $n。
我的问题是:Symfony 如何控制这种行为,我的意思是,如果一个路由有一个 {name} 参数,为什么控制器必须有一个带有 $name 参数的操作方法,并且参数 必须被称为$name?
因为在普通 PHP 中,这会起作用:
$name = 'Alex';
function indexAction($n) {
echo $n;
}
$f = 'indexAction';
$arguments = array($name);
call_user_func_array($f, $arguments);
即使函数签名接受名为 $n 而不是 $name 的参数。
我希望这个问题可以理解,如果不是,请告诉我,我会进行编辑。
感谢关注!
【问题讨论】:
标签: php symfony controller action