Laravelのパッケージ開発

Laravel5 PHP

 パッケージ作成

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フォルダ配下にパッケージのソースコードが配置される予定。

パッケージ作成01

パッケージ作成02

 

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のライセンスに合わせる。)

パッケージ作成03

cd 《パッケージ開発用プロジェクトの配置場所》\《パッケージ開発用プロジェクト名》\packages\《開発者名(小文字)》\《パッケージ名(小文字)》
composer init

 

namespace(名前空間)を設定

「composer.jsonを作成」章で作成した「composer.json」にパッケージのnamespaceを設定します。名前空間は「《開発者名》\《パッケージ名》」となります。

Composerを修正した後は「composer dump-autoload」を実行します。

パッケージ作成04

"autoload": {
    "psr-4": {
      "《開発者名》\\《パッケージ名》\\": "src/"
    }
}

パッケージ作成05

 

Rootフォルダ直下にある composer.json にパッケージを追加

パッケージを作成しているプロジェクト(Laravel)に「packages/《開発者名(小文字)》/《パッケージ名(小文字)》/src」フォルダを認識させるために、プロジェクトのcomposerを設定します。本記事の例では「C:\dev\project\arubehpkg\composer.json」を修正することになります。

Composerを修正した後は《パッケージ開発用プロジェクトの配置場所》配下で「composer dump-autoload」を実行します。

パッケージ作成06

《開発者名》\\《パッケージ名》\\": "packages/《開発者名(小文字)》/《パッケージ名(小文字)》/src

パッケージ作成07

Serviceを作成

「packages/《開発者名(小文字)》/《パッケージ名(小文字)》/src」フォルダ配下にServiceファイルを作成します。

  • Serviceファイルには処理のソースコードを記載する。
  • ファイル名、クラス名は「《サービス名》Service」とする。
  • 名前空間は「《開発者名》\《パッケージ名》」とする。

※ 本文書の例ではARUBEHという文字列を返却する処理を実装する。

パッケージ作成08

パッケージ作成09

パッケージ作成10

<?php

namespace 《開発者名》\《パッケージ名》;

class 《サービス名》Service
{
    public function 《サービスの処理名》()
    {
        // サービスの処理をコーディング
    }
}

 

ServiceProviderを作成

Laravelのartisanコマンドを利用してサービスプロバイダを作成して、パッケージフォルダに移動します。

  • サービスプロバイダを作成コマンド:php artisan make:provider 《サービスプロバイダ名》ServiceProvider
  • サービスプロバイダの作成コマンドを投入すると「app/Providers」配下にサービスプロバイダが作成される。
  • 作成されたサービスプロバイダファイルを「packages/《開発者名》/《パッケージ名》/src」フォルダ配下に移動する。

パッケージ作成11

パッケージ作成12

  • サービスプロバイダには「Serviceを作成」章で作成したサービスをサービスコンテナに登録します。
  • 名前空間は「《開発者名》\《パッケージ名》」とします。

package_service_provider

<?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」とする。

パッケージ作成14

パッケージ作成15

「ServiceProviderを作成」章で作成したサービスプロバイダを設定します。

名前空間は「《開発者名》\《パッケージ名》」とする。

パッケージ作成16

<?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」を実行します。

パッケージ作成17

'providers' => [
     :
    /*
     * Application Service Providers...
     */
     :
    《開発者名》\《パッケージ名》\《サービスプロバイダ名》ServiceProvider::class,
],

'aliases' => [
     :
    /*
     * Application aliases...
     */
    '《ファサード名》' => 《開発者名》\《パッケージ名》\《ファサード名》Facade::class,
],

パッケージ作成18

 

パッケージの動作確認

本文書ではルートファイルでパッケージの処理を利用し、ビューで表示します。

パッケージ作成19

Route::get('/', function () {
    $arubeh_str = 《ファサード名》::《サービスの処理名》();
    return view('welcome', compact('arubeh_str'));
});

パッケージ作成20

<body>
    <div class="container">
        <div class="content">
            <div class="title">{{ $arubeh_str }}</div>
        </div>
    </div>
</body>

以下のように表示されたら成功!

パッケージ作成21

 

パッケージを利用

パッケージを利用するためのプロジェクトを作成

「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”」を追加する。

パッケージ利用01

"repositories": [
    {
        "type": "path",
        "url": "《パッケージ開発用プロジェクトの配置場所》\\《パッケージ開発用プロジェクト名》\\packages\\《開発者名(小文字)》\\《パッケージ名(小文字)》"
    }
],
"require": {
    "php": ">=5.5.9",
    "laravel/framework": "5.1.*",
    "arubeh/arubehpkg": "dev-master"
},

「composer update」コマンドよりパッケージをインストールします。
※何故か「composer install」ではパッケージがインストールされないです。

パッケージ利用02

 

ServiceProviderとFacadeを追加

プロジェクトがパッケージのサービスプロバイダとファサードを認識できるように「config/app.php」にインストールしたパッケージのサービスプロバイダ、ファサードを追加します。

「config/app.php」修正後には「composer dump-autoload」を実行します。

パッケージ利用03

'providers' => [
     :
    /*
     * Application Service Providers...
     */
     :
    《開発者名》\《パッケージ名》\《サービスプロバイダ名》ServiceProvider::class,
],

'aliases' => [
     :
    /*
     * Application aliases...
     */
    '《ファサード名》' => 《開発者名》\《パッケージ名》\《ファサード名》Facade::class,
],

 

パッケージの動作確認

本文書ではルートファイルでパッケージの処理を利用し、ビューで表示します。

パッケージ利用04

Route::get('/', function () {
    $arubeh_str = 《ファサード名》::《サービスの処理名》();
    return view('welcome', compact('arubeh_str'));
});

パッケージ利用05

<body>
    <div class="container">
        <div class="content">
            <div class="title">{{ $arubeh_str }}</div>
        </div>
    </div>
</body>

以下のように表示されたら成功!

パッケージ利用06

 

関連記事

コメント

この記事へのコメントはありません。

カテゴリー

お問い合わせはコチラ!