1

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

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

我已经按照文档(精彩)将 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) 执行此操作?

4

2 回答 2

4

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

但是,这似乎是一种方法唯一的依赖,所以这是我的思维方式

您应该创建一个handleApiCallback在实例化后立即调用的方法,在该方法中您将传递您的@routerand@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);
    }
}
于 2013-08-19T10:10:04.827 回答
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;
    }
    
于 2013-08-18T05:27:56.503 回答