パッケージ作成
Laraavelのパッケージを作成し、作成したパッケージを他のプロジェクトで利用する手順をメモした記事です。
本記事を作成する時の開発の環境は以下となります。
- Windows 10 Home x64
- XAMPP 7.0.5
- Laravel 5.1 LTS
パッケージを開発するためのプロジェクトを作成
「C:\dev\project」配下に「arubehpkg」プロジェクト(パッケージを作成)を作成します。
- 《パッケージ開発用プロジェクトの配置場所》:C:\dev\project
- 《パッケージ開発用プロジェクト名》:arubehpkg
※インストール方法は
ここをご参照ください。
本記事の例は以下の命名に従います。
- 《開発者名》:Arubeh
- 《パッケージ名》:ArubehPkg
- 《サービス名》:ArubehSrv
- 《サービスプロバイダ名》:ArubehPrv
- 《ファサード名》:ArubehFcd
「packages/《開発者名(小文字)》/《パッケージ名(小文字)》/src」フォルダを作成します。本記事の例の場合は「packages/arubeh/arubehpkg/src」となります。
- 《開発者名(小文字)》フォルダ配下がパッケージが配置される予定。
- パッケージ毎のバージョン管理する時は《開発者名(小文字)》フォルダ配下が対象になる予定。(本記事ではバージョン管理設定はしていない。)
- 《開発者名(小文字)》フォルダ配下にパッケージの「composer.json」が配置される予定。
- 《開発者名(小文字)》/srcフォルダ配下にパッケージのソースコードが配置される予定。
composer.jsonを作成
以下の方法で《開発者名(小文字)》フォルダ配下に「composer.json」を作成します。
- コマンドプロンプトでパッケージの配置場所「《パッケージ開発用プロジェクトの配置場所》/《パッケージ開発用プロジェクト名》/packages/《開発者名(小文字)》/《パッケージ名(小文字)》」フォルダに移動し「composer init」を実行する。本記事の例では「C:\dev\project\arubehpkg\packages\arubeh\arubehpkg」配下で「composer init」を実行する。
Composerの内容は以下とします。
- nameには「《開発者名(小文字)》/《パッケージ名(小文字)》」を設定する。本記事では「arubeh/arubehpkg」になる。
- minimum Stabilityには「dev」を設定する。
- licenseには「MIT」を設定する。(※Laravelのライセンスに合わせる。)
cd 《パッケージ開発用プロジェクトの配置場所》\《パッケージ開発用プロジェクト名》\packages\《開発者名(小文字)》\《パッケージ名(小文字)》
composer init
namespace(名前空間)を設定
「composer.jsonを作成」章で作成した「composer.json」にパッケージのnamespaceを設定します。名前空間は「《開発者名》\《パッケージ名》」となります。
Composerを修正した後は「composer dump-autoload」を実行します。
"autoload": {
"psr-4": {
"《開発者名》\\《パッケージ名》\\": "src/"
}
}
Rootフォルダ直下にある composer.json にパッケージを追加
パッケージを作成しているプロジェクト(Laravel)に「packages/《開発者名(小文字)》/《パッケージ名(小文字)》/src」フォルダを認識させるために、プロジェクトのcomposerを設定します。本記事の例では「C:\dev\project\arubehpkg\composer.json」を修正することになります。
Composerを修正した後は《パッケージ開発用プロジェクトの配置場所》配下で「composer dump-autoload」を実行します。
《開発者名》\\《パッケージ名》\\": "packages/《開発者名(小文字)》/《パッケージ名(小文字)》/src
Serviceを作成
「packages/《開発者名(小文字)》/《パッケージ名(小文字)》/src」フォルダ配下にServiceファイルを作成します。
- Serviceファイルには処理のソースコードを記載する。
- ファイル名、クラス名は「《サービス名》Service」とする。
- 名前空間は「《開発者名》\《パッケージ名》」とする。
※ 本文書の例ではARUBEHという文字列を返却する処理を実装する。
<?php
namespace 《開発者名》\《パッケージ名》;
class 《サービス名》Service
{
public function 《サービスの処理名》()
{
// サービスの処理をコーディング
}
}
ServiceProviderを作成
Laravelのartisanコマンドを利用してサービスプロバイダを作成して、パッケージフォルダに移動します。
- サービスプロバイダを作成コマンド:php artisan make:provider 《サービスプロバイダ名》ServiceProvider
- サービスプロバイダの作成コマンドを投入すると「app/Providers」配下にサービスプロバイダが作成される。
- 作成されたサービスプロバイダファイルを「packages/《開発者名》/《パッケージ名》/src」フォルダ配下に移動する。
- サービスプロバイダには「Serviceを作成」章で作成したサービスをサービスコンテナに登録します。
- 名前空間は「《開発者名》\《パッケージ名》」とします。
<?php
namespace 《開発者名》\《パッケージ名》;
use Illuminate\Support\ServiceProvider;
class 《サービスプロバイダ名》ServiceProvider extends ServiceProvider
{
/**
* Bootstrap the application services.
*
* @return void
*/
public function boot()
{
//
}
/**
* Register the application services.
*
* @return void
*/
public function register()
{
$this->app->singleton('《サービスプロバイダ名》', function () {
return new 《サービス名》Service();
});
}
}
Façadeを作成
「ServiceProviderを作成」章でサービスコンテナに登録したサービスを静的なインタフェースで利用するためにファサードを作成します。
- ファサードを作成するartisanコマンドは用意されていないので、手動で作成する。
- ファサードファイル名、クラス名は「《ファサード名》Façade」とする。
「ServiceProviderを作成」章で作成したサービスプロバイダを設定します。
名前空間は「《開発者名》\《パッケージ名》」とする。
<?php
namespace 《開発者名》\《パッケージ名》;
use Illuminate\Support\Facades\Facade;
class 《ファサード名》Facade extends Facade
{
/**
* Get the registered name of the component.
*
* @return string
*/
protected static function getFacadeAccessor()
{
return '《サービスプロバイダ名》';
}
}
ServiceProviderとFacadeを追加
プロジェクトがパッケージのサービスプロバイダとファサードを認識できるように「config/app.php」に「ServiceProviderを作成」章、「Façadeを作成」章で作成したサービスプロバイダ、ファサードを追加します。
「config/app.php」修正後には「composer dump-autoload」を実行します。
'providers' => [
:
/*
* Application Service Providers...
*/
:
《開発者名》\《パッケージ名》\《サービスプロバイダ名》ServiceProvider::class,
],
'aliases' => [
:
/*
* Application aliases...
*/
'《ファサード名》' => 《開発者名》\《パッケージ名》\《ファサード名》Facade::class,
],
パッケージの動作確認
本文書ではルートファイルでパッケージの処理を利用し、ビューで表示します。
Route::get('/', function () {
$arubeh_str = 《ファサード名》::《サービスの処理名》();
return view('welcome', compact('arubeh_str'));
});
<body>
<div class="container">
<div class="content">
<div class="title">{{ $arubeh_str }}</div>
</div>
</div>
</body>
以下のように表示されたら成功!
パッケージを利用
パッケージを利用するためのプロジェクトを作成
「C:\dev\project」配下に「arubehapp」プロジェクトを作成します。
- 《パッケージ利用プロジェクトの配置場所》:C:\dev\project
- 《パッケージ利用プロジェクト名》:arubehapp
Composerよりパッケージをインストール
「composer.json」に「パッケージ作成」章で作成したパッケージを追加します。
- 本文書ではローカルフォルダに配置されているパッケージを追加するので「repositories」のtypeを「path」とする。(※Gitリポジトリからパッケージを追加するときは「vcs」と設定する。詳細はここを参照)
- urlには「パッケージを開発するためのプロジェクトを作成」章で作成したパッケージの配置場所「《パッケージ開発用プロジェクトの配置場所》\\《パッケージ開発用プロジェクト名》\\packages\\《開発者名(小文字)》\\《パッケージ名(小文字)》」を設定する。本記事の例では「C:\\dev\\project\\arubehpkg\\packages\\arubeh\\arubehpkg」となる。
- requireに「”《開発者名》/《パッケージ名》”: “dev-master”」を追加する。
"repositories": [
{
"type": "path",
"url": "《パッケージ開発用プロジェクトの配置場所》\\《パッケージ開発用プロジェクト名》\\packages\\《開発者名(小文字)》\\《パッケージ名(小文字)》"
}
],
"require": {
"php": ">=5.5.9",
"laravel/framework": "5.1.*",
"arubeh/arubehpkg": "dev-master"
},
「composer update」コマンドよりパッケージをインストールします。
※何故か「composer install」ではパッケージがインストールされないです。
ServiceProviderとFacadeを追加
プロジェクトがパッケージのサービスプロバイダとファサードを認識できるように「config/app.php」にインストールしたパッケージのサービスプロバイダ、ファサードを追加します。
「config/app.php」修正後には「composer dump-autoload」を実行します。
'providers' => [
:
/*
* Application Service Providers...
*/
:
《開発者名》\《パッケージ名》\《サービスプロバイダ名》ServiceProvider::class,
],
'aliases' => [
:
/*
* Application aliases...
*/
'《ファサード名》' => 《開発者名》\《パッケージ名》\《ファサード名》Facade::class,
],
パッケージの動作確認
本文書ではルートファイルでパッケージの処理を利用し、ビューで表示します。
Route::get('/', function () {
$arubeh_str = 《ファサード名》::《サービスの処理名》();
return view('welcome', compact('arubeh_str'));
});
<body>
<div class="container">
<div class="content">
<div class="title">{{ $arubeh_str }}</div>
</div>
</div>
</body>
以下のように表示されたら成功!