從 Laravel5 開始已經把 workbench 給拿掉了。也就是說 Laravel5 已經不協助我們建立套件這個部分了。所以如果要開發套件一切都要自行處理。但 Laravel5 還是有把套件有可能會使用到的 view、asset、tranlaction 等這些的來與Laravel串接。設定部分可以參考我這篇 Laravel 5 套件開發設定。接下來說明一下如果沒有 workbench 後如何開發 Laravel5 的套件。

workbench 基本上幫我們做了什麼事

workbench 協助我們建立套件的目錄架構與相關的檔案。這個目錄架構裡最主要包含了 src、test、composer.json 這些較主要的目錄與檔案,以及src裡面 namespace 相對應的目錄結構。這個 src 就是我們主要放置 source 的地方。workbench 也幫我們建立了與 Laravel 串接時所需的 Service Provider 檔案。

psr-0、psr-4 與套件的 namespace

在開始說明套件開發等的架構前,先說明一下 psr-0 或 psr-4 的差別。以及 namespace 所對應的目錄結構。

psr-0 與目錄結構

在 composer.json 如果使用的 atuoloading 是 psr-0,設定方式會是這樣:

"autoload": {
    ...省略
    "psr-0": {
        "Acme\\Foo\\": "src/",
    }
},

套件對應的目錄會是這樣

src/
  Acme/
    Foo/

如果我們有一個 Acme\Foo\Bar 的 namespace 就會對應到 src/Acme/Foo 這個目錄下的 Bar 類別。也就是說如果在某個類別裡寫了 use Acme\Foo\Bar\Baz 就是告訴 PHP, Baz 這個類別在 src/Acme/Foo/Bar 這目錄裡。

psr-4 與目錄結構

psr-4 和 psr-0 其實沒有太大的差別,差別的部分這裡就不說明了。但其中一個很重要的調整是 psr-4 讓我們可以縮短了我們在目錄裡的結構。

composer.json 設定方式如下:

"autoload": {
    "psr-4": {
        "Acme\\Foo\\": "src/"
    }
},

相同的,如果我們有一樣有一個 Acme\Foo\Bar 的 namespace 在 psr-4 只需要到 src 目錄下找 Bar 這一個 class。這樣psr-4 大大的簡潔了目錄裡的結構。

一切自己架構

至於 Laravel5 之後已經沒有 workbench 後,上面說的 workbench 做了什麼事,我們就要自己做了。我們建立一個新的 Laravel5 後,目錄結構會像是下面這樣:

app/
bootstrap/
config/
...省略
public/
.env.example
composer.json

我在升級 Laravel5 之前找了些方法,了解一下如何在沒有 workbench 後開發套件。有人說自己在 vendor 這個目錄裡面建立自己套件的目錄,或是把 workbench 安裝回來。

我的方式是自己架構目錄,且使用 psr-4。目錄會像是這樣。自己建立了一個 repositories 目錄,如下:

app/
bootstrap/
config/
repositories/
public/
.env.example
composer.json

在 composer.json 的 autload 會像是這樣

"autoload": {
    "psr-4": {
        "App\\": "app/",
        "Acme\\Foo\\": "repositories/src/"
    }
},

如果有多個套件要一起開發可以這樣子

"autoload": {
    "psr-4": {
        "App\\": "app/",
        "Acme\\Foo\\": "repositories/foo/src/",
        "Acme\\Bar\\": "repositories/bar/src/"
    }
},

套件的位置放在哪或資料夾名稱都可以自行的規劃

這些動作做完了之後要記得要執行 composer dump-autoload

執行完 composer dump-autoload 後我們可以在 /vendor/composer/autoload-psr4.php 這個檔案裡檢查是否我們的套件已經被設定進 composer autoload 了呢!如果有看到下方這樣的設定就代表可以了。

return array(
    ...略
    'Acme\\Foo\\' => array($baseDir . '/repositories/foo/src'),
    'Acme\\Bar\\' => array($baseDir . '/repositories/bar/src'),
    ...略
);

以上的內容取決於 composer.json 的 autoload 如何設定,每個套件都會不一樣

接下來可以在套件目錄裡放進所有所需的檔案或目錄,例如套件的 view、migrations、config 等等。

如果有多個套件,我的目錄大致上會像是這樣

app/
bootstrap/
config/
repositories/
  Foo/
    config/
    lang/
      en/
      zh-TW/
    migrations/
    src/
      FooServiceProvider.php
    tests/
    views/
      layouts/
      partials/
    composer.json
  Bar/
public/
.env.example
composer.json

套件的設定可以參考這篇 Laravel 5 套件開發設定

接下來就是享受開發套件的樂趣了!!