我试图通过generateUrl将FacebookSession类的对象传递给我的控制器,但是它给了我以下错误
警告:preg_match()期望参数2为字符串,对象在/Users/shashankm/Documents/Projects/myproject/app/cache/dev/classes.php第888行中给出
if($session) {
try {
//Redirect to a link here with the session variable using generateUrl
$url = $this->generateUrl('threadgab_userinfo_redirect', array('session' => $session), true);
return $this->redirect($url);
} catch(FacebookRequestException $e) {
//Create an error page for this scenario
}
}
被叫控制器如下:
我根据Michaels的回答做了以下代码更改,但它没有帮助:
/**
* @Route("/userinfo/{session}")
* @ParamConverter("session", class="Facebook:FacebookSession")
*/
class UserinfoController extends Controller
{
public function indexAction(FacebookSession $session)
{
return new Response("Got session id : ". $session->getToken());
}
}
是否可以在Symfony中执行此操作?
答案 0 :(得分:0)
为了将对象传递给Controller,您应该将它传递给Controller的构造函数。这是通过将Controller声明为服务并注入'来完成的。对象进入它。这称为依赖注入;您正在注入Controller将依赖的对象。
为此,我们首先需要重构Controller中的构造函数,以便它现在将对象作为参数。在这个例子中,我将自己的类Boo注入我的Controller,Foo
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Acme\DemoBundle\Classes\Bar;
class Foo extends Controller
{
private $bar;
public function __construct(Bar $bar){
$this->bar = $bar
}
}
我们现在需要将此Controller声明为服务:
// Acme/DemoBundle/Resources/config/services.yml
parameters:
acme.controller.foo.class: Acme\DemoBundle\Controller\FooController
acme.classes.bar.class: Acme\DemoBundle\Classes\Bar
services:
acme.foo.controller:
class: "%acme.controller.foo.class%"
arguments: ['%acme.classes.bar.class%']
这里,我们说通过传递Foo
实例来构造Bar
类。 Foo
和Bar
在parameters
部分的名称空间中被识别。
最后,我们需要将services.yml
导入到项目中:
// app/config/config.yml
imports:
- { resource: "@AcmeDemoBundle/Resources/config/services.yml
现在,每次在Controller中执行Action时,都会调用构造函数,并且应该实例化Bar对象。