是否可以在Symfony控制器中将类变量作为参数传递?

时间:2014-07-14 06:31:32

标签: php facebook symfony

我试图通过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中执行此操作?

1 个答案:

答案 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类。 FooBarparameters部分的名称空间中被识别。

最后,我们需要将services.yml导入到项目中:

// app/config/config.yml
imports:
    - { resource: "@AcmeDemoBundle/Resources/config/services.yml

现在,每次在Controller中执行Action时,都会调用构造函数,并且应该实例化Bar对象。