從 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 套件開發設定。
接下來就是享受開發套件的樂趣了!!