LoginSignup
2
1

More than 5 years have passed since last update.

[symfony2.8] DiExtraBundleを使ってサービスをアノテーションで管理する

Posted at

インストール等々、セットアップはこちらから

やっていること

ScheduleNotifierがSlackインスタンスを使って通知を行うようになっていると想定してください。
ScheduleNotifierが使うSlackインスタンスはDIされて使われます。

Before

service.yml
services:
    slack:
        class: AppBundle\Services\Slack
        arguments: ["%slack_name%", "%slack_channel%", "%webhook_url%"]

    schedule_notifier:
        class: AppBundle\Services\ScheduleNotifier
        arguments: ["@slack"]
Slack.php
<?php

namespace AppBundle\Services;

use Maknz\Slack\Client;

class Slack
{
    /** @var Client  */
    private $client;

    /**
     * Slack constructor.
     *
     * @param string $slackName
     * @param string $slackChannel
     * @param string $webhookUrl
     */
    public function __construct(
        string $slackName,
        string $slackChannel,
        string $webhookUrl
    )
    {
        $settings = [
            'username' => $slackName,
            'channel' => $slackChannel,
            'link_names' => true
        ];

        $this->client = new Client($webhookUrl, $settings);
    }
}
ScheduleNotifier.php
<?php

namespace AppBundle\Services;

class ScheduleNotifier
{
    /** @var Slack  */
    private $client;

    /**
     * ScheduleNotifier constructor.
     *
     * @param Slack $slack
     */
    public function __construct(Slack $slack)
    {
        $this->client = $slack;
    }
}

After

service.ymlが不要になり、下記で同じ挙動をするようになります

Slack.php
<?php

namespace AppBundle\Services;

use Maknz\Slack\Client;
use JMS\DiExtraBundle\Annotation as DI;

/**
 * @DI\Service("slack")
 */
class Slack
{
    /** @var Client  */
    private $client;

    /**
     * Slack constructor.
     *
     * @DI\InjectParams({
     *     @DI\Inject("%slack_name%"),
     *     @DI\Inject("%slack_channel%"),
     *     @DI\Inject("%webhook_url%")
     * })
     *
     * @param string $slackName
     * @param string $slackChannel
     * @param string $webhookUrl
     */
    public function __construct(
        string $slackName,
        string $slackChannel,
        string $webhookUrl
    )
    {
        $settings = [
            'username' => $slackName,
            'channel' => $slackChannel,
            'link_names' => true
        ];

        $this->client = new Client($webhookUrl, $settings);
    }
}
ScheduleNotifier.php
<?php

namespace AppBundle\Services;

use AppBundle\Services\Slack;
use JMS\DiExtraBundle\Annotation as DI;

/**
 * @DI\Service("schedule_notifier")
 */
class ScheduleNotifier
{
    /** @var Slack  */
    private $client;

    /**
     * ScheduleNotifier constructor
     *
     * @DI\InjectParams({
     *     "slack" = @DI\Inject("slack"),
     * })
     *
     * @param Slack $slack
     */
    public function __construct(Slack $slack)
    {
        $this->client = $slack;
    }
}

感想

定義ファイルが減るのはいいですね。

ただ、サービスが増えてくるとservice.ymlに一覧としてまとめて見れると
よかったりするのかなぁ。。

せっかくサービスとして切り離して再利用性を高めようとしているのに
使われなかったら意味ないですし。

Controllerへのinjectとかも設定できるようになるみたいなので
色々な用途がありそうです。

service.ymlに書いてたことはこちらで代替できそう、さらばservice.yml...

2
1
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
2
1