Symfony 2服务参数

时间:2013-08-17 22:19:27

标签: php api symfony instagram

我想在创建服务时传递给服务的其中一个参数是基于某些用户输入的字符串计算结果。如何自动实现这一点,以便每次我想从不同的控制器访问它时都不必将值传递给对象?

只是为了说明我正在添加以下示例:

我已按照文档(精彩)将Instagram API封装在服务中,因此在我的代码几乎中编写$instagram = $this->get('instagram');的工作原理与我需要的API通信一样还设置了一个回调URL,我目前在检索服务后总是要做的,例如:

    $redirect_url   = $this->getRequest()->getSchemeAndHttpHost().$this->generateUrl('_instagram_authenticate_response');
    $instagram      = $this->get('instagram');
    $instagram->setApiCallback($redirect_url);

可以这样做一次,但不是我在与Instagram交谈时使用的每种方法。请帮助:)

更新:我的服务定义如下:

parameters:
    client_id: xxxxx
    client_secret: yyyyy

services:
    instagram:
        class: Clops\InstagramBundle\InstagramAPI
        arguments: ["%client_id%", "%client_secret%"]

问题是 - >如何将第三个参数作为控制器中生成的值传递?或者,在获得服务后,我是否总是必须通过setValue(X)执行此操作?

2 个答案:

答案 0 :(得分:4)

它看起来像一个依赖注入问题 如上所述,您只需将@router@request作为服务参数传递。

然而,它似乎只是一种方法依赖,所以这是我的思维方式

您应该创建一个handleApiCallback方法,该方法会在实例化后立即调用,您可以通过该方法传递@router@request
这样你的班级就不会与Symfony强烈联系

作为旁注,您无法直接传递@request作为参数,您需要将服务声明为request-scoped

services.yml

services:
    instagram:
        class: Clops\InstagramBundle\InstagramAPI
        scope: request
        arguments:
            - %client_id%
            - %client_secret%
        calls:
            - [ handleApiCallback, [ @request, @router ] ]

Clops \ InstagramBundle \ InstagramAPI

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\RouterInterface;

class InstagramApi
{
    public function handleApiCallback(Request $request, RouterInterface $router)
    {
        $host  = $request->getSchemeAndHttpHost();
        $route = $router->generateUrl('_instagram_authenticate_response');
        $uri   = $host.$route;

        $this->setApiCallback($uri);
    }
}

答案 1 :(得分:0)

  1. 您可以在服务中内部生成参数。在您的情况下,您可以将requestrouter转到服务并开始工作。

  2. 创建一个具有方法getInstagram()的基本控制器。

    public function getInstagram() 
    {
        $redirect_url = $this->getRequest()->getSchemeAndHttpHost().$this->generateUrl('_instagram_authenticate_response');
        $instagram = $this->get('instagram');
        $instagram->setApiCallback($redirect_url);
        return $instagram;
    }