0 フォロワー

拡張機能

拡張機能とは、Yiiアプリケーションで使用するために特別に設計された再配布可能なソフトウェアパッケージであり、すぐに使用できる機能を提供します。たとえば、yiisoft/yii2-debug拡張機能は、ページの生成方法をより簡単に把握できるように、アプリケーションのすべてのページの下部に便利なデバッグツールバーを追加します。拡張機能を使用して開発プロセスを加速できます。また、自分のコードを拡張機能としてパッケージ化して、他の人と素晴らしい成果を共有することもできます。

情報: Yii固有のソフトウェアパッケージを指すために「拡張機能」という用語を使用します。Yiiなしで使用できる汎用ソフトウェアパッケージの場合は、「パッケージ」または「ライブラリ」という用語を使用します。

拡張機能の使用

拡張機能を使用するには、まずそれをインストールする必要があります。ほとんどの拡張機能はComposerパッケージとして配布されており、次の2つの簡単な手順でインストールできます。

  1. アプリケーションのcomposer.jsonファイルを変更し、インストールする拡張機能(Composerパッケージ)を指定します。
  2. composer installを実行して、指定された拡張機能をインストールします。

Composerをお持ちでない場合は、Composerをインストールする必要がある場合がありますのでご注意ください。

デフォルトでは、ComposerはオープンソースのComposerパッケージの最大のレポジトリであるPackagistに登録されたパッケージをインストールします。 Packagistで拡張機能を探すことができます。また、独自のレポジトリを作成し、それを使用するようにComposerを設定することもできます。これは、プロジェクト内でのみ共有したいプライベート拡張機能を開発している場合に役立ちます。

Composerによってインストールされた拡張機能は、BasePath/vendorディレクトリに保存されます。ここで、BasePathはアプリケーションのベースパスを指します。Composerは依存関係マネージャーであるため、パッケージをインストールすると、それに依存するすべてのパッケージもインストールされます。

例えば、yiisoft/yii2-imagine エクステンションをインストールするには、あなたの composer.json を以下のように修正します。

{
    // ...

    "require": {
        // ... other dependencies

        "yiisoft/yii2-imagine": "*"
    }
}

インストール後、BasePath/vendor の下に yiisoft/yii2-imagine というディレクトリが見えるはずです。また、インストールされた依存パッケージを含む別のディレクトリ imagine/imagine も見えるはずです。

情報: yiisoft/yii2-imagine は、Yii 開発チームによって開発および保守されているコアエクステンションです。すべてのコアエクステンションは Packagist でホストされており、yiisoft/yii2-xyz のように命名されています。ここで、xyz はエクステンションによって異なります。

これで、インストールしたエクステンションをアプリケーションの一部であるかのように使用できます。次の例は、yiisoft/yii2-imagine エクステンションによって提供される yii\imagine\Image クラスをどのように使用できるかを示しています。

use Yii;
use yii\imagine\Image;

// generate a thumbnail image
Image::thumbnail('@webroot/img/test-image.jpg', 120, 120)
    ->save(Yii::getAlias('@runtime/thumb-test-image.jpg'), ['quality' => 50]);

情報: エクステンションクラスは、Yii クラスオートローダーによってオートロードされます。

手動でのエクステンションのインストール

まれに、Composer に依存するのではなく、一部またはすべてのエクステンションを手動でインストールしたい場合があります。そうするには、次の手順に従ってください。

  1. エクステンションのアーカイブファイルをダウンロードし、vendor ディレクトリに展開します。
  2. エクステンションによって提供されるクラスオートローダーがあれば、それらをインストールします。
  3. 指示に従って、すべての依存エクステンションをダウンロードしてインストールします。

エクステンションにクラスオートローダーがないものの、PSR-4 標準に従っている場合は、Yii によって提供されるクラスオートローダーを使用して、エクステンションクラスをオートロードできます。必要なのは、エクステンションのルートディレクトリに対して ルートエイリアスを宣言することだけです。たとえば、エクステンションをディレクトリ vendor/mycompany/myext にインストールし、エクステンションクラスが myext 名前空間の下にあると仮定すると、アプリケーション構成に次のコードを含めることができます。

[
    'aliases' => [
        '@myext' => '@vendor/mycompany/myext',
    ],
]

エクステンションの作成

あなたの素晴らしいコードを他の人と共有したいと感じたときには、エクステンションを作成することを検討できます。エクステンションには、ヘルパークラス、ウィジェット、モジュールなど、好きなコードを含めることができます。

最後のサブセクションで説明したように、他のユーザーがより簡単にインストールして使用できるように、Composer パッケージの形でエクステンションを作成することをお勧めします。

以下は、Composer パッケージとしてエクステンションを作成するために従うことができる基本的な手順です。

  1. エクステンションのプロジェクトを作成し、github.com などの VCS リポジトリでホストします。エクステンションの開発とメンテナンス作業は、このリポジトリで行う必要があります。
  2. プロジェクトのルートディレクトリの下に、Composer で必須の composer.json という名前のファイルを作成します。詳細については、次のサブセクションを参照してください。
  3. あなたのエクステンションを、Packagist などの Composer リポジトリに登録して、他のユーザーが Composer を使用してあなたのエクステンションを見つけてインストールできるようにします。

composer.json

各 Composer パッケージは、ルートディレクトリに composer.json ファイルを持っている必要があります。このファイルには、パッケージに関するメタデータが含まれています。このファイルに関する完全な仕様は、Composer マニュアルにあります。次の例は、yiisoft/yii2-imagine エクステンションの composer.json ファイルを示しています。

{
    // package name
    "name": "yiisoft/yii2-imagine",

    // package type
    "type": "yii2-extension",

    "description": "The Imagine integration for the Yii framework",
    "keywords": ["yii2", "imagine", "image", "helper"],
    "license": "BSD-3-Clause",
    "support": {
        "issues": "https://github.com/yiisoft/yii2/issues?labels=ext%3Aimagine",
        "forum": "https://forum.yiiframework.com/",
        "wiki": "https://yii.dokyumento.jp/wiki/",
        "irc": "ircs://irc.libera.chat:6697/yii",
        "source": "https://github.com/yiisoft/yii2"
    },
    "authors": [
        {
            "name": "Antonio Ramirez",
            "email": "amigo.cobos@gmail.com"
        }
    ],

    // package dependencies
    "require": {
        "yiisoft/yii2": "~2.0.0",
        "imagine/imagine": "v0.5.0"
    },

    // class autoloading specs
    "autoload": {
        "psr-4": {
            "yii\\imagine\\": ""
        }
    }
}

パッケージ名

各 Composer パッケージには、すべてのパッケージの中でパッケージを一意に識別するパッケージ名が必要です。パッケージ名の形式は vendorName/projectName です。たとえば、パッケージ名 yiisoft/yii2-imagine では、ベンダー名とプロジェクト名はそれぞれ yiisoftyii2-imagine です。

Yii コアコードでの使用のために予約されているため、ベンダー名として yiisoft を使用しないでください。

Yii 2 エクステンションを表すパッケージの場合、myname/yii2-mywidget のように、プロジェクト名に yii2- をプレフィックスとして付けることをお勧めします。これにより、ユーザーはパッケージが Yii 2 エクステンションかどうかをより簡単に判断できます。

パッケージタイプ

エクステンションのパッケージタイプを yii2-extension として指定することは重要です。これにより、パッケージはインストール時に Yii エクステンションとして認識されるようになります。

ユーザーが composer install を実行してエクステンションをインストールすると、ファイル vendor/yiisoft/extensions.php が自動的に更新され、新しいエクステンションに関する情報が含まれます。このファイルから、Yii アプリケーションはどのエクステンションがインストールされているかを知ることができます (この情報は yii\base\Application::$extensions を介してアクセスできます)。

依存関係

あなたのエクステンションは Yii (もちろん) に依存しています。したがって、composer.jsonrequire エントリにそれを (yiisoft/yii2) リストする必要があります。エクステンションが他のエクステンションまたはサードパーティライブラリにも依存している場合は、それらもリストする必要があります。また、各依存パッケージに適切なバージョン制約 (例: 1.*, @stable) をリストするようにしてください。エクステンションが安定版でリリースされる場合は、安定した依存関係を使用してください。

ほとんどの JavaScript/CSS パッケージは、Composer の代わりに BowerNPM を使用して管理されています。Yii は Composer asset plugin を使用して、Composer を介してこれらの種類のパッケージを管理できるようにしています。エクステンションが Bower パッケージに依存している場合は、次のように composer.json に依存関係をリストするだけで済みます。

{
    // package dependencies
    "require": {
        "bower-asset/jquery": ">=1.11.*"
    }
}

上記のコードは、エクステンションが jquery Bower パッケージに依存していることを示しています。一般に、composer.json で Bower パッケージを参照するには bower-asset/PackageName を使用し、NPM パッケージを参照するには npm-asset/PackageName を使用できます。Composer が Bower または NPM パッケージをインストールすると、デフォルトでは、パッケージコンテンツはそれぞれ @vendor/bower/PackageName および @vendor/npm/Packages ディレクトリの下にインストールされます。これら 2 つのディレクトリは、より短いエイリアス @bower/PackageName および @npm/PackageName を使用して参照することもできます。

アセット管理の詳細については、アセットセクションを参照してください。

クラスのオートロード

クラスを Yii クラスオートローダーまたは Composer クラスオートローダーでオートロードできるようにするには、以下に示すように、composer.json ファイルに autoload エントリを指定する必要があります。

{
    // ....

    "autoload": {
        "psr-4": {
            "yii\\imagine\\": ""
        }
    }
}

1 つまたは複数のルート名前空間と、それに対応するファイルパスをリストできます。

エクステンションがアプリケーションにインストールされると、Yii はリストされた各ルート名前空間に対して、その名前空間に対応するディレクトリを参照する エイリアス を作成します。たとえば、上記の autoload 宣言は、@yii/imagine という名前のエイリアスに対応します。

エクステンションは他の人が使用することを目的としているため、開発中にさらに努力する必要があることがよくあります。以下に、高品質のエクステンションを作成する際の一般的で推奨されるプラクティスを紹介します。

名前空間

名前の衝突を避け、エクステンションのクラスをオートロード可能にするには、名前空間を使用し、PSR-4 標準または PSR-0 標準に従ってエクステンションのクラスに名前を付ける必要があります。

クラスの名前空間は vendorName\extensionName で始める必要があります。ここで、extensionName はパッケージ名のプロジェクト名に似ていますが、yii2- プレフィックスを含めないようにする必要があります。たとえば、yiisoft/yii2-imagine エクステンションの場合、クラスの名前空間として yii\imagine を使用します。

ベンダー名として yiiyii2、または yiisoft を使用しないでください。これらの名前は、Yii コアコードでの使用のために予約されています。

ブートストラップクラス

場合によっては、アプリケーションの ブートストラッププロセス ステージ中にエクステンションがいくつかのコードを実行したい場合があります。たとえば、エクステンションは、環境設定を調整するためにアプリケーションの beginRequest イベントに応答したい場合があります。エクステンションのユーザーに、beginRequest イベントにエクステンションのイベントハンドラーを明示的にアタッチするように指示することもできますが、より良い方法はこれを自動的に行うことです。

この目標を達成するには、yii\base\BootstrapInterface を実装することにより、いわゆる *ブートストラップクラス* を作成できます。例えば、

namespace myname\mywidget;

use yii\base\BootstrapInterface;
use yii\base\Application;

class MyBootstrapClass implements BootstrapInterface
{
    public function bootstrap($app)
    {
        $app->on(Application::EVENT_BEFORE_REQUEST, function () {
             // do something here
        });
    }
}

次に、次のようにエクステンションの composer.json ファイルにこのクラスをリストします。

{
    // ...

    "extra": {
        "bootstrap": "myname\\mywidget\\MyBootstrapClass"
    }
}

エクステンションがアプリケーションにインストールされると、Yii は自動的にブートストラップクラスをインスタンス化し、すべてのリクエストのブートストラッププロセス中にその bootstrap() メソッドを呼び出します。

データベースの操作

エクステンションはデータベースにアクセスする必要がある場合があります。エクステンションを使用するアプリケーションが常に DB 接続として Yii::$db を使用することを想定しないでください。代わりに、DB アクセスを必要とするクラスの db プロパティを宣言する必要があります。このプロパティを使用すると、エクステンションのユーザーは、エクステンションで使用したい DB 接続をカスタマイズできます。例として、yii\caching\DbCache クラスを参照し、db プロパティがどのように宣言および使用されているかを確認してください。

エクステンションが特定の DB テーブルを作成したり、DB スキーマを変更したりする必要がある場合は、次の手順に従う必要があります。

  • プレーンな SQL ファイルを使用するのではなく、DB スキーマを操作するための マイグレーションを提供します。
  • マイグレーションをさまざまな DBMS に適用できるようにします。
  • マイグレーションで Active Record を使用しないようにします。

アセットの使用

エクステンションがウィジェットまたはモジュールの場合、動作するためにいくつかの アセット が必要になる可能性があります。たとえば、モジュールは、画像、JavaScript、および CSS を含むいくつかのページを表示する場合があります。エクステンションのファイルはすべて、アプリケーションにインストールすると Web アクセスできない同じディレクトリの下にあるため、Web を介してアセットファイルに直接アクセスできるようにするための 2 つの選択肢があります。

  • エクステンションのユーザーに、アセットファイルを特定の Web アクセス可能なフォルダーに手動でコピーするように依頼します。
  • アセットバンドルを宣言し、アセット公開メカニズムに依存して、アセットバンドルにリストされたファイルを Web アクセス可能なフォルダーに自動的にコピーします。

エクステンションを他の人がより簡単に使用できるように、2 番目の方法を使用することをお勧めします。アセットを操作する方法の詳細については、アセットセクションを参照してください。

国際化とローカリゼーション

あなたのエクステンションは、異なる言語をサポートするアプリケーションで使用される可能性があります。したがって、エクステンションがエンドユーザーにコンテンツを表示する場合は、国際化とローカライズを試みる必要があります。特に、

  • エクステンションがエンドユーザー向けのメッセージを表示する場合、それらのメッセージは翻訳できるようにYii::t()でラップする必要があります。開発者向けのメッセージ(内部例外メッセージなど)は翻訳する必要はありません。
  • エクステンションが数値、日付などを表示する場合は、適切な書式設定ルールを使用してyii\i18n\Formatterで書式設定する必要があります。

詳細については、国際化セクションを参照してください。

テスト

エクステンションが他の人に問題を引き起こすことなく、完璧に動作するようにする必要があります。この目標を達成するためには、エクステンションを一般公開する前にテストする必要があります。

手動テストに頼るのではなく、エクステンションコードを網羅する様々なテストケースを作成することをお勧めします。エクステンションの新しいバージョンをリリースするたびに、これらのテストケースを実行して、すべてが良好な状態であることを確認できます。Yiiは、ユニットテスト、受け入れテスト、機能テストをより簡単に作成できるように、テストのサポートを提供しています。詳細については、テストセクションを参照してください。

バージョン管理

エクステンションの各リリースには、バージョン番号(例:1.0.1)を付与する必要があります。どのバージョン番号を使用すべきかを決定する際には、セマンティックバージョニングのプラクティスに従うことをお勧めします。

リリース

他の人にエクステンションを知ってもらうためには、それを一般公開する必要があります。

エクステンションを初めてリリースする場合は、PackagistなどのComposerリポジトリに登録する必要があります。その後、必要なのはエクステンションのVCSリポジトリにリリースタグ(例:v1.0.1)を作成し、新しいリリースについてComposerリポジトリに通知するだけです。これにより、他の人は新しいリリースを見つけ、Composerリポジトリを通じてエクステンションをインストールまたは更新できるようになります。

エクステンションのリリースでは、コードファイルに加えて、他の人がエクステンションについて学び、使用するのに役立つように、以下を含めることも検討する必要があります。

  • パッケージのルートディレクトリにあるreadmeファイル:エクステンションが何をするのか、インストール方法、使用方法を説明します。Markdown形式で記述し、ファイル名をreadme.mdにすることをお勧めします。
  • パッケージのルートディレクトリにあるchangelogファイル:各リリースで行われた変更をリストします。このファイルはMarkdown形式で記述し、changelog.mdという名前を付けることができます。
  • パッケージのルートディレクトリにあるupgradeファイル:エクステンションの古いリリースからアップグレードする方法に関する指示を示します。このファイルはMarkdown形式で記述し、upgrade.mdという名前を付けることができます。
  • チュートリアル、デモ、スクリーンショットなど:これらは、エクステンションがreadmeファイルで完全にカバーできない多くの機能を提供する場合に必要です。
  • APIドキュメント:他の人がコードをより簡単に読み、理解できるように、コードは十分にドキュメント化する必要があります。コードをドキュメント化する方法については、BaseObjectクラスファイルを参照してください。

情報: コードのコメントはMarkdown形式で記述できます。yiisoft/yii2-apidocエクステンションは、コードのコメントに基づいて美しいAPIドキュメントを生成するためのツールを提供します。

情報: 必須ではありませんが、エクステンションが特定のコーディングスタイルに準拠することをお勧めします。コアフレームワークのコードスタイルを参照してください。

コアエクステンション

Yiiは、Yii開発チームによって開発および保守されている以下のコアエクステンション(または「公式エクステンション」)を提供しています。これらはすべてPackagistに登録されており、エクステンションの使用サブセクションで説明されているように簡単にインストールできます。

  • yiisoft/yii2-apidoc:拡張可能で高性能なAPIドキュメントジェネレーターを提供します。コアフレームワークのAPIドキュメントの生成にも使用されます。
  • yiisoft/yii2-authclient:Facebook OAuth2クライアント、GitHub OAuth2クライアントなど、一般的に使用される認証クライアントのセットを提供します。
  • yiisoft/yii2-bootstrapBootstrapコンポーネントとプラグインをカプセル化するウィジェットのセットを提供します。
  • yiisoft/yii2-debug:Yiiアプリケーションのデバッグサポートを提供します。このエクステンションを使用すると、すべてのページの下部にデバッガーツールバーが表示されます。このエクステンションは、より詳細なデバッグ情報を表示するための一連のスタンドアロンページも提供します。
  • yiisoft/yii2-elasticsearchElasticsearchの使用をサポートします。基本的なクエリ/検索サポートが含まれており、Active Recordパターンも実装しており、Active RecordをElasticsearchに格納できます。
  • yiisoft/yii2-fakerFakerを使用してフェイクデータを生成するサポートを提供します。
  • yiisoft/yii2-gii:高度に拡張可能で、モデル、フォーム、モジュール、CRUDなどを迅速に生成するために使用できるWebベースのコードジェネレーターを提供します。
  • yiisoft/yii2-httpclient:HTTPクライアントを提供します。
  • yiisoft/yii2-imagineImagineに基づいた、一般的に使用される画像操作関数を提供します。
  • yiisoft/yii2-juiJQuery UIのインタラクションとウィジェットをカプセル化するウィジェットのセットを提供します。
  • yiisoft/yii2-mongodbMongoDBの使用をサポートします。基本的なクエリ、Active Record、移行、キャッシュ、コード生成などの機能が含まれています。
  • yiisoft/yii2-queue:キューを介してタスクを非同期的に実行するためのサポートを提供します。DB、Redis、RabbitMQ、AMQP、Beanstalk、Gearmanに基づくキューをサポートしています。
  • yiisoft/yii2-redisredisの使用をサポートします。基本的なクエリ、Active Record、キャッシュなどの機能が含まれています。
  • yiisoft/yii2-shellpsyshに基づいたインタラクティブシェルを提供します。
  • yiisoft/yii2-smartySmartyに基づいたテンプレートエンジンを提供します。
  • yiisoft/yii2-sphinxSphinxの使用をサポートします。基本的なクエリ、Active Record、コード生成などの機能が含まれています。
  • yiisoft/yii2-symfonymailerSymfony Mailerに基づいたメール送信機能を提供します。
  • yiisoft/yii2-twigTwigに基づいたテンプレートエンジンを提供します。

以下の公式エクステンションは、Yii 2.1以上用です。Yii 2.0では、コアフレームワークに含まれているため、インストールする必要はありません。

タイプミスを発見した場合、またはこのページを改善する必要があると思われる場合
githubで編集 !