如何调用在 service.yml 中声明的环境变量?

How can I call a environnement variable declared in my service.yml?

我正在处理一个需要重构的 symfony 项目。 我正在尝试调用 servces.yml 中声明的环境变量 当我 运行 php bin/console debug:container --parameters 时,我可以看到变量。

我试过了$this->getParameters('param_name'); 当我将它们转储到控制器中时它工作正常但是当我尝试从服务访问它们时它失败了 -> Method 'getParameter' not found in 'TwitterService' 我认为这种方法是 symfony 原生的。

这是我的推特服务

```namespace App\Services;
use Abraham\TwitterOAuth\TwitterOAuth;

/**
 * Class TwitterService.
 */
class TwitterService
{
    /** @const int NUMBER_OF_TWEETS */
    private const NUMBER_OF_TWEETS = 2;

    /**
     * @param string $twitterID
     *
     * @return array|object
     */
    public function getTwitterFeed($twitterID = 'RISKandMe')
    {
        // @todo move config to .env
        $consumerKey = $this->getParameter('consumer_key');
        $consumerSecret = $this->getParameter('consumer_secret');
        $accessToken = $this->getParameter('access_token');
        $accessTokenSecret = $this->getParameter('access_token');
        // Authenticate with twitter
        $twitterConnection = new TwitterOAuth(
            $consumerKey,
            $consumerSecret,
            $accessToken,
            $accessTokenSecret
        );
        // Get the user timeline feeds

        return $twitterConnection->get(
            'statuses/user_timeline',
            [
                'screen_name' => $twitterID,
                'count' => self::NUMBER_OF_TWEETS,
                'exclude_replies' => false,
            ]
        );
    }
}

这是我的 services.yml:

parameters:
    locale: 'fr'
    api_key_validity: '%env(int:APIKEYVALIDITY)%'
    activation_delay: '%env(int:ACTIVATIONDELAY)%'
    gophish_api_key: '%env(GOPHISHAPIKEY)%'
    gophish_server: '%env(GOPHISHSERVER)%'
    gophish_white_list: '%env(GOPHISHWHITELIST)%'
    mailjet_public: '%env(MAILJET_PUBLIC_KEY)%'
    mailjet_secret: '%env(MAILJET_PRIVATE_KEY)%'
    sender_address: '%env(SENDER_ADDRESS)%'
    sender_name: '%env(SENDER_NAME)%'
    consumer_key: '%env(CONSUMER_KEY)%'
    consumer_secret: '%env(CONSUMER_SECRET)%'
    access_token: '%env(ACCESS_TOKEN)%'
    access_token_secret: '%env(ACCESS_TOKEN_SECRET)%'
services:
    _defaults:
        autowire: true      # Automatically injects dependencies in your services.
        autoconfigure: true # Automatically registers your services as commands, event subscribers, etc.
#    user_listener:
#        class: App\EntityListener\UserListener
#        arguments: ['@logger']
#        tags:
#            - { name: doctrine.orm.entity_listener,entity: App\Entity\User}
#
    form_authenticator:
          class: App\Security\FormAuthenticator
          arguments: ["@logger","@router","@security.password_encoder","@doctrine.orm.default_entity_manager",CsrfTokenManagerInterface]
    token_authenticator:
          class: App\Security\TokenAuthenticator
          arguments: ["@logger","@router","@security.password_encoder","@doctrine.orm.default_entity_manager",CsrfTokenManagerInterface,ParameterBagInterface]
    DbUserProvider:
        class: App\Security\DbUserProvider

    FickleUserProvider:
        class: App\Security\FickleUserProvider    

    BackEndUserProvider:
        class: App\Security\BackEndUserProvider    

    App\:
        resource: '../src/*'
        exclude: '../src/{DependencyInjection,Entity,Migrations,Tests,Kernel.php}'
    App\Controller\Services\Helper:
        arguments: ['@logger','@router','@security.password_encoder','@mailer','@session','@doctrine.orm.default_entity_manager']
        tags: ['controller.service_arguments']
    App\Controller\Services\GoPhish:
        arguments: []
        tags: []
    App\Controller\:
        resource: '../src/Controller/DashboardController.php'
        arguments: ["@logger","@router","@security.password_encoder",'@doctrine.orm.default_entity_manager',App\Controller\Services\Helper]
        tags: ['controller.service_arguments']
    twig.extension.intl:
        class: Twig_Extensions_Extension_Intl
        tags:
            - { name: twig.extension }
#    session.listener:
#        class: App\Listeners\SessionListener
#        tags:
#            - { name: kernel.event_listener, event: kernel.request, method: onKernelRequest }
#    user.activity_listener:
#        class: App\Listeners\ActivityListener
#       tags:
#            - { name: kernel.event_listener, event: kernel.controller, method: onCoreController }
    Symfony\Component\HttpFoundation\Session\Storage\Handler\PdoSessionHandler:
        arguments:
            - '%env(string:DBCONNEXIONPARAMETERS)%'
            - { db_table: 'ht_session', db_username: '%env(string:DBUSER)%', db_password: '%env(string:DBPASSWORD)%'}
    app.services.twitter:
        class: App\Services\TwitterService

如果有人有任何想法,他们将不胜感激。

非常感谢您的关注。

$this->getParameter() 辅助函数仅在从 class Symfony\Bundle\FrameworkBundle\Controller\AbstractController; 扩展的控制器中可用。

为了访问您服务中的容器参数,您需要将其注入或自动装配到您的服务中。

# services.yml
services:
    _defaults:
        bind:
            # schema -> [constructor-variable name]: [parameter name]
            $consumerSecret: '%consumer_secret%' 
            $consumerKey: '%consumer_key%'
            # [..]

然后按如下方式使用它们:

class TwitterService
{
    private $csonsumerSecret;
    private $consumerKey;

    public function __construct(
        string $consumerKey,
        string $consumerSecret,
        // [..]
    ) {
        $this->consumerKey = $consumerKey;
        $this->consumerSecret = $consumerSecret;
        // [..]
    }

    public function getTwitterFeed($twitterID = 'RISKandMe')
    {
       $twitterConnection = new TwitterOAuth(
            $this->consumerKey,
            $this->consumerSecret,
            // [..]
        );