Laravel Packages Development 套件開發

建立本地端的套件資料夾

在本地端開發套件,可以在 Laravel 根目錄自行建立 packages 目錄,然後將套件放在下方路徑中

packages > <user_name> > <package_name> > <code_folder>

app
packages            # 套件資料夾(原本沒有此資料,需要自行建立)
    kejyun          # <user_name> 作者名稱
        larapack    # <package_name> 套件名稱
            src     # <code_folder> 所有套件程式皆放在此目錄

所有套件相關的程式皆放在此路徑下

建立套件 composer.json

在建立的套件目錄下初始化此套件的 composer.json

~/laravel_project/packages/kejyun/larapack $ composer init

Package name (<vendor>/<name>) [vagrant/larapack]: kejyun/larapack
Description []: KJ Larapack
Author [, n to skip]: KeJyun <kejyun@gmail.com>
Minimum Stability []: dev
Package Type (e.g. library, project, metapackage, composer-plugin) []:
License []: MIT

Define your dependencies.

Would you like to define your dependencies (require) interactively [yes]? no
Would you like to define your dev dependencies (require-dev) interactively [yes]? no

{
    "name": "kejyun/larapack",
    "description": "KJ Larapack",
    "license": "MIT",
    "authors": [
        {
            "name": "KeJyun",
            "email": "kejyun@gmail.com"
        }
    ],
    "minimum-stability": "dev",
    "require": {}
}

Do you confirm generation [yes]?

建立完的套件 composer.json 會長的像這樣

{
    "name": "kejyun/larapack",
    "description": "KJ Larapack",
    "license": "MIT",
    "authors": [
        {
            "name": "KeJyun",
            "email": "kejyun@gmail.com"
        }
    ],
    "minimum-stability": "dev",
    "require": {}
}

設定根目錄與套件目錄的 psr-4 自動載入程式

1. 根目錄 composer.json

在開發過程中,為了測試方便,需要能夠在本地端直接讀取到套件的資料,在根目錄的 composer.json 直接設定使用 psr-4 自動載入套件路徑的程式,並設定在此路徑下的命名空間

命名空間需與接下來要上傳到 Packagist 給大家使用的套件命名空間相同,若之後需要讓大家用 <user_name>\<package_name> 使用您的套件,這邊的命名空間就需預先設定好,在開發套件過程中,也可以直接用這樣的方式去存取套件

/* composer.json */
{
    "autoload": {
        "classmap": [
            "database/seeds",
            "database/factories"
        ],
        "psr-4": {
            "App\\": "app/",
            "KeJyun\\Larapack\\" : "packages/kejyun/larapack/src"
        }
    },
}

2. 套件目錄 composer.json

在套件目錄設定套件命名空間的目錄為 src 目錄,在使用 composer require 安裝套件到 vendor 目錄時,autoload 會使用此命名空間去載入套件 src 目錄的程式

/* packages/kejyun/larapack/composer.json */
{
    "autoload": {
        "psr-4": {
            "KeJyun\\Larapack\\": "src"
        }
    },
}

3. 產生 autoload 檔案

因為需要載入非 vendor 目錄的套件資料,是自行設定的自動載入目錄,所以需要在專案根目錄產生新的 autoload 檔案

~/laravel_project $ composer dump-autoload
Generating optimized autoload files

建立套件類別 Larapack

app
packages            # 套件資料夾(原本沒有此資料,需要自行建立)
    kejyun          # <user_name> 作者名稱
        larapack    # <package_name> 套件名稱
            src     # <code_folder> 所有套件程式皆放在此目錄
                Larapack.php                    # 套件主程式

我們套件程式的進入點為 packages/kejyun/larapack/src/Larapack.php,在裡面可以寫一個簡單的 dump 方法,等等可以測試是否可以正常呼叫

<?php
// packages/kejyun/larapack/src/Larapack.php
namespace KeJyun\Larapack;


class Larapack {

    public function dump($message)
    {
        dump($message);
    }
}

建立套件 ServiceProvider 與 Facade

Packagist 是所有 PHP 相關的套件,不是只提供給 Laravel 做使用,所以若要讓套件可以支援 Laravel,則必須提供 ServiceProvider 與 Facade 讓我們能夠快速的在 Laravel 使用套件的方法

app
packages            # 套件資料夾(原本沒有此資料,需要自行建立)
    kejyun          # <user_name> 作者名稱
        larapack    # <package_name> 套件名稱
            src     # <code_folder> 所有套件程式皆放在此目錄
                Larapack.php                    # 套件主程式
                LarapackServiceProvider.php     # 套件 ServiceProvider(for laravel)
                LarapackFacade.php              # 套件 Facade(for laravel)

在 ServiceProvider 註冊一個名稱為 larapack 的類別,使用 Larapack 物件作為此類別

<?php

namespace KeJyun\Larapack;

use Illuminate\Support\ServiceProvider;

class LarapackServiceProvider extends ServiceProvider
{
    public function boot()
    {

    }

    // 註冊套件函式
    public function register()
    {
        $this->app->singleton('larapack', function ($app) {
            return new Larapack();
        });
    }
}

使用在 ServiceProvider 註冊的 larapack類別,作為 Laravel 的 Facade 物件

<?php

namespace KeJyun\Larapack;

use Illuminate\Support\Facades\Facade;

class LarapackFacade extends Facade
{
    protected static function getFacadeAccessor()
    {
        return 'larapack';
    }
}

Laravel 套件設定

可以將剛剛建立的 ServiceProvider 及 Facade 設定到 config/app.php 檔案中,這樣 Laravel 就可以正常的存取這個套件

// config/app.php
return [
    'providers' => [
        KeJyun\Larapack\LarapackServiceProvider::class,
    ],
    'aliases' => [
        'Larapack' => \KeJyun\Larapack\LarapackFacade::class,
    ],
];

呼叫此套件

建立一個套件控制器,可以試著呼叫剛剛建立的套件,就可以在畫面中順利的看到你的套件被正常呼叫了。

<?php

namespace App\Http\Controllers;

use Larapack;

class PackageController extends Controller {

    public function larapack()
    {
        Larapack::dump('My Laravel Package');
    }
}

參考資料

KeJyun 最新新書推薦
- Laravel 5 for beginner 新手道場:優雅運用框架快速開發 PHP 網站
- Laravel框架开发详解:从零基础到运用框架快速开发PHP网站

Laravel 是 PHP 的框架(Framework),提供了很多開發網站或 API 所需的工具及環境,經過簡單的設定就可以完成資料的處理及顯示,使開發者可以很優雅且快速的開發出各個不同的產品。本書適合有 PHP 基礎的人,但不知道要怎麼選擇框架,或者不用框架的人也能夠明白它的好處。

雖然 WordPress 也能夠架站,但如果有客製化需求,要開發各式各樣的網站,或提供 App 使用的 API,如此一來你只能選擇用框架,而 Laravel 是目前最受歡迎的。

本書將解說為什麼要使用框架,以及理解框架的優缺點後,要怎麼選擇框架,並用框架快速建構一個網站。除非必要,否則書中會避免專業技術用語,盡量使用最生活化易懂的例子及語氣,讓大家更容易進入 Laravel 的世界。

Laravel 5 for beginner 新手道場:優雅運用框架快速開發 PHP 網站

購書連結

Laravel框架开发详解:从零基础到运用框架快速开发PHP网站

購書連結

comments powered by Disqus