代码之家  ›  专栏  ›  技术社区  ›  Joozty

symfony中的Autowire字符串参数

  •  2
  • Joozty  · 技术社区  · 6 年前

    如何在Symfony 3.4中连接字符串参数?

    我有简单的服务,我想给 url 中指定的参数 parameters.yml :

    namespace AppBundle\Service;
    
    use Psr\Log\LoggerInterface;
    
    class PythonService {
    
        private $logger;
        private $url;
    
        /**
         * @param LoggerInterface $logger
         * @param String $url
         */
        public function __construct(LoggerInterface $logger, String $url) {
            $this->logger = $logger;
            $this->url = $url;
        }
    }
    

    我的 service.yml 看起来像:

    AppBunde\Services\PythonService:
        arguments: ['@logger', '%url%']
    

    但我错了:

    Cannot autowire service "AppBundle\Service\PythonService": argument "$url" of method "__construct()" is type-hinted "string", you should configure its value explicitly.
    

    我还尝试手动指定参数:

    AnalyticsDashboardBunde\Services\PythonService:
        arguments:
            $logger: '@logger'
            $url: '%session_memcached_host%'
    

    这会导致以下错误:

    Invalid service "AppBundle\Services\PythonService": class "AppBundle\Services\PythonService" does not exist.
    
    2 回复  |  直到 6 年前
        1
  •  8
  •   crmpicco    6 年前

    首先,你在 AppBundle\Services\PythonService (服务<gt;服务)。

    然后,string<gt;字符串。php中没有大写。


    可以将参数绑定到特定的参数/服务:

    服务.yml:

    services:
        _defaults:
            bind:
                $memcacheHostUri: '%session_memcached_host%'
    

    服务类:(必须与指定的变量名相同^)

    public function __construct(LoggerInterface $logger, string $memcacheHostUri)
    

    控制器动作:

    public function myAwesomeAction(PythonService $pythonService)
    {
        $pythonService->doPythonStuffs();
    }
    

    使用此解决方案,如果您创建了其他需要 memecacheHostUri ,它也将为这些服务自动连接。

    资源:

    Argument binding

        2
  •  0
  •   TsV    6 年前
        //    services.yml
        app.python_service:
        class: AppBundle\Service\PythonService
        arguments:
            $logger: '@monolog.logger.request'
            $url: 'link'
        public: true
    
         //   in controller
        //use container:
        $pS = $this->container->get('app.python_service');