インストール等々、セットアップはこちらから
やっていること
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...