anybody's game

日々感じたこと、艦隊これくしょん、千年戦争アイギス、読書記録

Symfonyでカスタムコマンドから設定を利用する【はてなブログ】PHPStormからはてなブログを使う Part.3

前回のおさらい

aods1004.hatenablog.jp

カスタムスクリプトSymfonyから実行できるように設定するところまでやりました。

Symfonyでカスタムコマンドから設定を利用する

パスワードなど、Githubでの公開にそぐわないので、設定ファイルとして記述しておいて、 そのファイルを公開しないようにします。

Dotenvコンポーネント

Symfonyでは、環境設定をうまい具合に使う機能として、Dotenvコンポーネントが用意されています。

symfony.com

 Part.1 でインストールされたスケルトンに含まれていたので、特にインストール作業などはなく使えました。symfonyのコンソールから使うとこのコンポーネントは自動的に読み込まれるようで、特に設定などはしていません。

このようにルートの「.env」に書きます。

HATENA_BLOG_API_SECRET=xxxxxxxx
HATENA_BLOG_API_USER=aods1004

すると、dotenvのloadが走ったあと、getenvで設定した値が取得できるようになりました。

<?php
# $dotenv->load(__DIR__.'/.env');
# Frameworkを使えば$dotenv->load()は、自動的にやってくれる。

$password = getenv('HATENA_BLOG_API_SECRET');
$username = getenv('HATENA_BLOG_API_USER');
Dotenvで読み込まれた環境設定を、Symfony console の aboutで確認する

 Dotenvで読み込んだ環境設定は、Symfony consoleのaboutコマンドで確認することができました。現状のミドルウェア系のバージョン等も記載されているため、メモしておきます。

> C:\xampp\php\php.exe D:\documents\MyWorks\HatenaBlog\phpstorm-hatenablog-client\bin\console about
 ------------------------ ------------------------------------------- 
  Symfony                                                             
 ------------------------ ------------------------------------------- 
  Version                  4.0.9                                      
  End of maintenance       07/2018                                    
  End of life              01/2019                                    
 ------------------------ ------------------------------------------- 
  Kernel                                                              
 ------------------------ ------------------------------------------- 
  Type                     App\Kernel                                 
  Name                     src                                        
  Environment              dev                                        
  Debug                    true                                       
  Charset                  UTF-8                                      
  Root directory           .\src                                      
  Cache directory          ./var/cache/dev (341 KiB)                  
  Log directory            ./var/log (0 B)                            
 ------------------------ ------------------------------------------- 
  PHP                                                                 
 ------------------------ ------------------------------------------- 
  Version                  7.2.0                                      
  Architecture             32 bits                                    
  Intl locale              n/a                                        
  Timezone                 Europe/Berlin (2018-05-13T09:08:13+02:00)  
  OPcache                  false                                      
  APCu                     false                                      
  Xdebug                   false                                      
 ------------------------ ------------------------------------------- 
  Environment (.env)                                                  
 ------------------------ ------------------------------------------- 
  APP_ENV                  dev                                        
  HATENA_BLOG_API_SECRET   xxxxxxxx                                 
  HATENA_BLOG_API_USER     aods1004                                   
 ------------------------ ------------------------------------------- 

Dependency Injection

 せっかくフレームワークを使っているので、DIで環境設定を行いたいですね。

ROOT/config/service.yaml に、以下のように書き加えると、オブジェクトが生成されたときに自動的にユーザー、パスワードを運んできてくれるようです。リファクタリングしたら、Repositoryみたいなデータアクセスをつかさどるクラスにこうやって設定をいれればよいんですね。

parameters:
    app.hatena_blog_api_secret: '%env(HATENA_BLOG_API_SECRET)%',
    app.hatena_blog_api_user: '%env(HATENA_BLOG_API_USER)%',
services:
    # 中略
    fetch_hatena_blog_entries:
        class: App\Command\FetchHatenaBlogEntriesCommand
        arguments: ['%app.hatena_blog_api_user%', '%app.hatena_blog_api_secret%']

コマンドクラスの書き換え

 設定をインジェクトする記述はできたので、こんどは、コマンドスクリプトのクラスで受け取れるようにします。まだ、パスワードなど設定をもらって、それを表示するだけです。service.yaml で書いた設定が、コンストラクタに渡されれば今回の目標達成です。

<?php

namespace App\Command;

# 中略

/**
 * Class FetchHatenaBlogEntriesCommand
 * @package App\Command
 */
class FetchHatenaBlogEntriesCommand extends Command
{

    /** @var string|null */
    protected $user;
    /** @var string|null */
    protected $password;

    /**
     * FetchHatenaBlogEntriesCommand constructor.
     * @param null|string $user
     * @param null|string $password
     */
    public function __construct(?string $user = null, ?string $password = null)
    {
        $this->user = $user;
        $this->password = $password;
        parent::__construct();
    }

    # 中略

    /**
     * {@inheritdoc}
     */
    protected function execute(InputInterface $input, OutputInterface $output)
    {
        var_dump($this->password, $this->user);
    }
}

https://github.com/aods1004/phpstorm-hatenablog-client/blob/984532315822260bcb6a540120d1fa4770b61634/src/Command/FetchHatenaBlogEntriesCommand.php

実行 結果
> C:\xampp\php\php.exe D:\documents\MyWorks\HatenaBlog\phpstorm-hatenablog-client\bin\console app:fetch-entries
string(10) "xxxxxxxx"
string(8) "aods1004"

Process finished with exit code 0 at 16:16:46.
Execution time: 1,146 ms.

 無事、コマンドをうつと、パスワードとユーザー名が出力され、設定がスクリプトまで渡っていることがわかりました。次回は、これらの設定をつかって、HatenaBlogAPIを叩けるようにがんばりたいと思います。

ここまでの成果

github.com