<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>コンポーネント  |  takeHo（たけほ）のへなちょこ台帳</title>
	<atom:link href="https://blog.takeho.com/tag/%e3%82%b3%e3%83%b3%e3%83%9d%e3%83%bc%e3%83%8d%e3%83%b3%e3%83%88/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.takeho.com</link>
	<description>いわゆる自由帳ってところです。</description>
	<lastBuildDate>Tue, 09 Dec 2025 01:29:19 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.6</generator>

<image>
	<url>https://blog.takeho.com/wp-content/uploads/2024/08/icon-150x150.png</url>
	<title>コンポーネント  |  takeHo（たけほ）のへなちょこ台帳</title>
	<link>https://blog.takeho.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Yii2でコンポーネントをカスタマイズする方法</title>
		<link>https://blog.takeho.com/hrp7l4b680m2xzd557ywbcfrl5ki68i3/</link>
					<comments>https://blog.takeho.com/hrp7l4b680m2xzd557ywbcfrl5ki68i3/#respond</comments>
		
		<dc:creator><![CDATA[たけほ]]></dc:creator>
		<pubDate>Sun, 17 Nov 2024 03:00:00 +0000</pubDate>
				<category><![CDATA[Yii2]]></category>
		<category><![CDATA[コンポーネント]]></category>
		<guid isPermaLink="false">https://blog.takeho.com/?p=538</guid>

					<description><![CDATA[Yii2のコンポーネントは、アプリケーション内で繰り返し使用する機能をカプセル化する便利な仕組みです。この記事では、実践的なサンプルコードを交えて、コンポーネントのカスタマイズ方法を詳しく解説します。 目次 カスタムコン [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>Yii2のコンポーネントは、アプリケーション内で繰り返し使用する機能をカプセル化する便利な仕組みです。この記事では、実践的なサンプルコードを交えて、コンポーネントのカスタマイズ方法を詳しく解説します。</p>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-2"><label class="toc-title" for="toc-checkbox-2">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">カスタムコンポーネントを作成する</a><ol><li><a href="#toc2" tabindex="0">コンポーネントファイルを作成</a></li><li><a href="#toc3" tabindex="0">コンポーネントをアプリケーションに登録する</a></li><li><a href="#toc4" tabindex="0">カスタムコンポーネントを使用する</a></li><li><a href="#toc5" tabindex="0">高度な設定を追加する</a></li></ol></li><li><a href="#toc6" tabindex="0">例: 外部SMSサービスと連携</a></li><li><a href="#toc7" tabindex="0">まとめ</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">カスタムコンポーネントを作成する</span></h2>



<p>たとえば、独自の通知システムを作成するとします。以下の手順で実装できます。</p>



<h3 class="wp-block-heading"><span id="toc2">コンポーネントファイルを作成</span></h3>



<p><code>components</code> ディレクトリに <code>Notifier.php</code> を作成します。</p>



<pre class="wp-block-code"><code>namespace app\components;

use Yii;
use yii\base\Component;

class Notifier extends Component
{
    public $fromEmail = 'default@example.com'; // デフォルト値

    /**
     * 通知メールを送信する
     * @param string $toEmail
     * @param string $subject
     * @param string $message
     * @return bool
     */
    public function sendEmail($toEmail, $subject, $message)
    {
        return Yii::$app->mailer->compose()
            ->setFrom($this->fromEmail)
            ->setTo($toEmail)
            ->setSubject($subject)
            ->setTextBody($message)
            ->send();
    }

    /**
     * シンプルなログを記録
     * @param string $message
     */
    public function logNotification($message)
    {
        Yii::info($message, 'notifier');
    }
}</code></pre>



<h3 class="wp-block-heading"><span id="toc3">コンポーネントをアプリケーションに登録する</span></h3>



<p>アプリケーションの設定ファイル <code>config/web.php</code> に登録します。</p>



<pre class="wp-block-code"><code>'components' => &#91;
    'notifier' => &#91;
        'class' => 'app\components\Notifier',
        'fromEmail' => 'no-reply@yourapp.com', // プロパティを上書き
    ],
],</code></pre>



<h3 class="wp-block-heading"><span id="toc4">カスタムコンポーネントを使用する</span></h3>



<p>コントローラやサービスクラスで簡単に利用できます。</p>



<pre class="wp-block-code"><code>namespace app\controllers;

use Yii;
use yii\web\Controller;

class SiteController extends Controller
{
    public function actionSendNotification()
    {
        $notifier = Yii::$app->notifier;

        // 通知メールを送信
        $toEmail = 'user@example.com';
        $subject = 'お知らせ';
        $message = 'こんにちは、こちらは通知メールです！';

        if ($notifier->sendEmail($toEmail, $subject, $message)) {
            $notifier->logNotification("通知を $toEmail に送信しました。");
            return "通知メールを送信しました！";
        }

        return "通知メールの送信に失敗しました。";
    }
}</code></pre>



<h3 class="wp-block-heading"><span id="toc5">高度な設定を追加する</span></h3>



<p>場合によっては、外部サービスとの連携やさらなる機能拡張が必要になることがあります。その際、依存性を注入する方法が役立ちます。</p>



<h2 class="wp-block-heading"><span id="toc6">例: 外部SMSサービスと連携</span></h2>



<p><code>Notifier.php</code> を以下のように拡張します。</p>



<pre class="wp-block-code"><code>namespace app\components;

use Yii;
use yii\base\Component;

class Notifier extends Component
{
    public $smsService; // 外部サービスのインスタンス

    /**
     * SMSを送信する
     * @param string $phoneNumber
     * @param string $message
     * @return bool
     */
    public function sendSms($phoneNumber, $message)
    {
        if (!$this->smsService) {
            throw new \Exception("SMSサービスが設定されていません。");
        }

        return $this->smsService->send($phoneNumber, $message);
    }
}</code></pre>



<p>そして、設定ファイルでSMSサービスを注入します。</p>



<pre class="wp-block-preformatted">'components' => [<br>    'notifier' => [<br>        'class' => 'app\components\Notifier',<br>        'smsService' => [<br>            'class' => 'app\components\SmsService', // 外部サービスの実装クラス<br>        ],<br>    ],<br>],</pre>



<h2 class="wp-block-heading"><span id="toc7">まとめ</span></h2>



<p>Yii2のコンポーネントをカスタマイズすることで、再利用可能なコードを簡潔にまとめることができます。この記事で紹介した例を参考に、自分のプロジェクトに合わせたコンポーネントを設計してみてください。</p>



<p>ブログに掲載する際は、さらに適用例やスクリーンショットを追加して読みやすくすると良いでしょう！</p>





<a rel="noopener" href="https://www.yiiframework.com/doc/guide/2.0/ja/structure-application-components" title="アプリケーションの構造: アプリケーション・コンポーネント" class="blogcard-wrap external-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img decoding="async" src="https://www.yiiframework.com/image/facebook_cover.png" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="160" height="90" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">アプリケーションの構造: アプリケーション・コンポーネント</div><div class="blogcard-snippet external-blogcard-snippet"></div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://www.yiiframework.com/doc/guide/2.0/ja/structure-application-components" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">www.yiiframework.com</div></div></div></div></a>

]]></content:encoded>
					
					<wfw:commentRss>https://blog.takeho.com/hrp7l4b680m2xzd557ywbcfrl5ki68i3/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
