LoginSignup
0
0

オプション設定をシンプルに、"OptionsResolver"

Last updated at Posted at 2023-12-19

Symfony Component Advent Calendar 2023の20日目の記事です。

オブジェクトのプロパティ設定をシンプルに、"OptionsResolver"

OptionsResolverは、配列でオプションの値を管理している際に、デフォルト値をシンプルに定義するレゾルバを提供します。

インストール

composer require symfony/options-resolver

使い方

通常、配列でオプションの値を管理して、メソッドで値を設定できるようにするには、ちょっとめんどくさいことをしなければいけません。

class SomeService;
{
    private array $options;
    
    public function setOptions(array $options = [])
    {
        $this->options['name'] = $options['name'] ?? 'Anonymous';
        $this->options['email'] = $options['email'] ?? 'sample@qiita.com';
    }

    // もしくは
    public function setOptions(array $options = [])
    {
        $this->options = array_replace([
            'name' => 'Anonymous',
            'email' => 'sample@qiita.com',
        ], $options);
    }
}

OptionsResolverはこのデフォルト値の設定や必須項目などを定義することができます。

use Symfony\Component\OptionsResolver\OptionsResolver;

class SomeService
{
    private array $options;

    public function setOptions(array $options = [])
    {
        // OptionsResolverの設定
        $optionsResolver = new OptionsResolver();
        $optionsResolver->setDefaults([
            'name' => 'Anonymous',
            'email' => 'sample@qiita.com',
        ]); // デフォルト値の設定
        
        $optionsResolver->setRequired('email'); // 必須項目の設定
        $optionsResolver->setAllowedType('email', 'string'); // 型の設定

        $this->options = $optionsResolver->resolve($options);
    }
}

setDefaults() でデフォルト値、setRequired()で必須項目、setAllowedType()で型の設定ができます。
resolve()で未設定の場合はデフォルト値をセットした配列を取得できます。

効果的な使い方

これだけ見ると、逆にちょっとめんどくさくなった感がありますが、親子関係を持ったクラスなどに便利です。


abstract class ArticleReader
{
    protected HttpClient $httpClient;
    protected array $options;

    public function setOptions(array $options)
    {
        $resolver = new OptionsResolver();
        $this->configureOptions($resolver);
        $this->options = $resolver->resolve($options);
    }
    
    public function read(array $options)
    {
        $this->setOptions($options);
        
        $this->httpClient->request(
            $this->options['method'],
            $this->options['url'],
            $json,
            [
                'headers' => $this->options['headers'],
            ]
        );

        ...
    }
    
    public function configureOptions(OptionsResolver $resolver);
}

class QiitaArticleReader
{
    public function configureOptions($resolver) {
        $resolver->setDefaults([
            'url' => 'https://qiita.com/api/v2/items',
            'method' => 'GET',
        ]);
    }
}

class ZennArticleGenerator
{
    public function configureOptions($resolver) {
        $resolver->setDefaults([
            'url' => 'https://zenn.dev/api/articles',
            'method' => 'GET',
        ]);
    }
}

まとめ

今回はOptionsResolverについて紹介しました。このほかにも配列からオブジェクトを作るためのFactoryクラスなどでも役立ちます!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0