Yiiアプリケーションでサードパーティコードを使用する必要がある場合や、Yiiをサードパーティシステムでライブラリとして使用したい場合があります。このセクションでは、これらの目標を達成する方法を示します。
Yiiアプリケーションでサードパーティライブラリを使用するには、主に、ライブラリのクラスが適切にインクルードされているか、またはオートロードできることを確認する必要があります。
多くのサードパーティライブラリは、Composerパッケージとしてリリースされています。このようなライブラリは、次の2つの簡単な手順でインストールできます。
composer.json
ファイルを修正し、インストールするComposerパッケージを指定します。composer install
を実行して、指定されたパッケージをインストールします。インストールされたComposerパッケージのクラスは、Composerオートローダーを使用してオートロードできます。アプリケーションのエントリスクリプトに、Composerオートローダーをインストールするための次の行が含まれていることを確認してください。
// install Composer autoloader
require __DIR__ . '/../vendor/autoload.php';
// include Yii class file
require __DIR__ . '/../vendor/yiisoft/yii2/Yii.php';
ライブラリがComposerパッケージとしてリリースされていない場合は、インストール手順に従ってインストールする必要があります。ほとんどの場合、リリースファイルを手動でダウンロードし、BasePath/vendor
ディレクトリに展開する必要があります。ここで、BasePath
はアプリケーションのベースパスを表します。
ライブラリに独自のクラスオートローダーが含まれている場合は、アプリケーションのエントリスクリプトにインストールできます。Yiiクラスオートローダーがクラスのオートロードを優先できるように、Yii.php
ファイルを含める前にインストールすることをお勧めします。
ライブラリがクラスオートローダーを提供していないが、クラス名がPSR-4に従っている場合は、Yiiクラスオートローダーを使用してクラスをオートロードできます。必要なのは、クラスで使用される各ルートネームスペースのルートエイリアスを宣言することだけです。たとえば、vendor/foo/bar
ディレクトリにライブラリをインストールし、ライブラリクラスがxyz
ルートネームスペースの下にあるとします。アプリケーションの設定に次のコードを含めることができます。
[
'aliases' => [
'@xyz' => '@vendor/foo/bar',
],
]
上記いずれも当てはまらない場合、ライブラリがクラスファイルの正しい位置特定とインクルードにPHP includeパス設定に依存している可能性があります。PHP includeパスの設定方法に関するライブラリの指示に従ってください。
最悪の場合、ライブラリがすべてのクラスファイルを明示的にインクルードすることを要求する場合、オンデマンドでクラスをインクルードするには次の方法を使用できます。
Yii::$classMap
に、クラスと対応するファイルパスをリストします。例:Yii::$classMap['Class1'] = 'path/to/Class1.php';
Yii::$classMap['Class2'] = 'path/to/Class2.php';
Yiiは多くの優れた機能を提供するため、WordPress、Joomla、または他のPHPフレームワークを使用して開発されたアプリケーションなど、サードパーティシステムの開発や拡張をサポートするために、その機能の一部を使用したい場合があります。たとえば、yii\helpers\ArrayHelperクラスを使用したり、サードパーティシステムでアクティブレコード機能を使用したりする場合があります。この目標を達成するには、主にYiiのインストールとブートストラップの2つの手順を実行する必要があります。
サードパーティシステムがComposerを使用して依存関係を管理している場合は、次のコマンドを実行してプロジェクトの要件にYiiを追加します。
composer require yiisoft/yii2
Yiiのデータベース抽象化レイヤーまたはその他の資産関連以外の機能のみを使用したい場合は、BowerとNPMパッケージのインストールを防ぐ特別なComposerパッケージを必要とします。cebe/assetfree-yii2を参照してください。
Composerと、インストール中に発生する可能性のある問題の解決策の詳細については、一般的なYiiのインストールに関するセクションも参照してください。
それ以外の場合は、Yiiリリースファイルをダウンロードして、BasePath/vendor
ディレクトリに解凍できます。
次に、サードパーティシステムのエントリスクリプトの先頭に次のコードを含めることで、変更する必要があります。
require __DIR__ . '/../vendor/yiisoft/yii2/Yii.php';
$yiiConfig = require __DIR__ . '/../config/yii/web.php';
new yii\web\Application($yiiConfig); // Do NOT call run() here
ご覧のように、上記のコードは典型的なYiiアプリケーションのエントリスクリプト内のコードと非常によく似ています。唯一の違いは、アプリケーションインスタンスが作成された後、run()
メソッドが呼び出されないことです。これは、run()
を呼び出すと、Yiiがリクエスト処理ワークフローの制御を引き継ぎますが、このケースでは必要なく、既存のアプリケーションによって既に処理されているためです。
Yiiアプリケーションと同様に、サードパーティシステムを実行している環境に基づいてアプリケーションインスタンスを設定する必要があります。たとえば、アクティブレコード機能を使用するには、サードパーティシステムで使用されているDB接続設定を使用して、db
アプリケーションコンポーネントを設定する必要があります。
これで、Yiiによって提供されるほとんどの機能を使用できます。たとえば、アクティブレコードクラスを作成して、データベースとの作業に使用できます。
以前Yii 1を使用していた場合、実行中のYii 1アプリケーションがある可能性があります。アプリケーション全体をYii 2で書き直す代わりに、Yii 2でのみ利用可能な機能の一部を使用して拡張したい場合があります。これは、以下のようにして実現できます。
注:Yii 2はPHP 5.4以降が必要です。サーバーと既存のアプリケーションの両方がこれをサポートしていることを確認する必要があります。
まず、前のセクションの手順に従って、既存のアプリケーションにYii 2をインストールします。
次に、アプリケーションのエントリスクリプトを次のように変更します。
// include the customized Yii class described below
require __DIR__ . '/../components/Yii.php';
// configuration for Yii 2 application
$yii2Config = require __DIR__ . '/../config/yii2/web.php';
new yii\web\Application($yii2Config); // Do NOT call run(), yii2 app is only used as service locator
// configuration for Yii 1 application
$yii1Config = require __DIR__ . '/../config/yii1/main.php';
Yii::createWebApplication($yii1Config)->run();
Yii 1とYii 2の両方にYii
クラスがあるため、それらを組み合わせるためのカスタマイズされたバージョンを作成する必要があります。上記のコードには、カスタマイズされたYii
クラスファイルが含まれており、次のように作成できます。
$yii2path = '/path/to/yii2';
require $yii2path . '/BaseYii.php'; // Yii 2.x
$yii1path = '/path/to/yii1';
require $yii1path . '/YiiBase.php'; // Yii 1.x
class Yii extends \yii\BaseYii
{
// copy-paste the code from YiiBase (1.x) here
}
spl_autoload_unregister(array('YiiBase','autoload'));
spl_autoload_register(array('Yii','autoload'));
Yii::$classMap = include($yii2path . '/classes.php');
// register Yii 2 autoloader via Yii 1
Yii::registerAutoloader(['yii\BaseYii', 'autoload']);
// create the dependency injection container
Yii::$container = new yii\di\Container;
以上です!これで、コードのどの部分でも、Yii::$app
を使用してYii 2アプリケーションインスタンスにアクセスし、Yii::app()
を使用してYii 1アプリケーションインスタンスを取得できます。
echo get_class(Yii::app()); // outputs 'CWebApplication'
echo get_class(Yii::$app); // outputs 'yii\web\Application'
タイプミスを発見したか、このページの改善が必要だと考えますか?
Githubで編集する !
サインアップまたはログインしてコメントしてください。