前回のおさらい
カスタムスクリプトをSymfonyから実行できるように設定するところまでやりました。
Symfonyでカスタムコマンドから設定を利用する
パスワードなど、Githubでの公開にそぐわないので、設定ファイルとして記述しておいて、 そのファイルを公開しないようにします。
Dotenvコンポーネント
Symfonyでは、環境設定をうまい具合に使う機能として、Dotenvコンポーネントが用意されています。
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); } }
実行 結果
> 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を叩けるようにがんばりたいと思います。