| app | ||
| bootstrap | ||
| config | ||
| database | ||
| public | ||
| resources | ||
| routes | ||
| storage | ||
| tests | ||
| .editorconfig | ||
| .env.example | ||
| .gitattributes | ||
| .gitignore | ||
| .styleci.yml | ||
| artisan | ||
| composer.json | ||
| composer.lock | ||
| package-lock.json | ||
| package.json | ||
| phpunit.xml | ||
| README.md | ||
| server.php | ||
| webpack.mix.js | ||
1. 系統需求
- PHP 7.3
- PHP Extensions
- BCMath
- Ctype
- JSON
- Mbstring
- OpenSSL
- PDO PHP
- Tokenizer
- XML,
2. IDE需求
- 支援Editor Config
3. 額外Composer套件
3.1 Dev
會自動產生Laravel相關的phpDocs, 使IDE對Laravel的支援度提高
輔助偵錯用的小工具
3.2 Online
權限管理(Role、Permission)
Redis連線套件
4. 安裝注意事項(網站資料庫重置後請從4.2開始)
4.1 Laravel安裝步驟
- 安裝Node Packages
npm i
- 複製.env.example 至 .env
cp .env.example .env
- 產生APP Key
php artisan key:generate
- 在.env填好資料庫資訊
4.2 網站安裝步驟
- 安裝資料表,建立預設資料
php artisan migrate --seed
- 建立管理員權限帳號
php artisan account:create-admin {email} {password}
- 建立編輯者權限帳號
php artisan account:create-editor {email} {password}
- 訪問後台,預設路徑為*/adm*
5. Debugbar使用說明
使用套件為 barryvdh/laravel-debugbar(正式環境請勿開啟)
5.1 載入Debugbar
將 .env 檔案內的 APP_DEBUG 設為 true
5.2 啟用與停用
啟用: 在網址後傳入參數: __debugbar , 值為 enable
例: https://example.com/?__debugbar=enable
停用: 在網址後傳入參數: __debugbar , 值為 enable 之外的任意值
例: https://example.com/?__debugbar=disable
6. 設定語系
新訪問的使用者會根據瀏覽器語言自動設定語系
如不支援,則設定成設定檔app.fallback_locale所定義的語系
6.1 支援的語系
所有支援的語系資訊在 config/languages.php
6.2 切換語系
網址傳入參數: locale
例: https://example.com/?locale=ja
7. 資料夾檔案與類別
7.1 程式類別
- Controllers
App\Http\Controllers\Admin
後台
App\Http\Controllers\Admin\Menu
後台選單
- App\Presenters
用來輔助產生Html或文字的類別
- App\Repositories
用來進行複雜的資料庫存取,可繼承BaseRepository
- App\Service
其他的輔助類別
7.2 Config(設定檔)
- config/admin.php
後台相關設定檔
- config/data-resets.php
網站的種子資料(須在網站安裝時存入的資料,透過Seeder安裝)
- config/languages.php
網站所支援的語系
7.3 圖片檔案
- storage/app/public/uploads/app
媒體庫上傳的檔案
8.自訂Artisan指令列表
Artisan指令參數格式:
{xxx}必填,輸入 xxx{xxx?}選填,輸入 xxx{--xxx}可選選項,輸入 --xxx{--xxx=}可選選項,輸入 --xxx=值,不帶的話都是隨機產生
輸入範例,指令media:create {amount?} {--app} {--user=} {--width=} {--height=} {--category=}
media:create 1
media:create --app --user=1 --width=1080
media:create --user=1 --category=12
8.1 帳號
- 建立管理員帳號
account:create-admin {Email} {密碼}
- 產生編輯帳號
account:create-editor{Email} {密碼}
8.2 建立檔案
- 建立一個Repository類別檔案
make:repository {類別名稱: xxxRepository}
- 建立一個後台選單Controller(MenuItemController)檔案
主項目
make:menu-item-controller ParentMenuItemController
子項目
make:menu-item-controller Parent/Children/ChildrenMenuItemController
8.3 媒體庫(參考9.)
- 產生媒體庫圖片
media:generate {數量?}預設1 {--user=}使用者id {--width=}寬度 {--height=}高度 {--category=}媒體庫分類id
8.5 媒體庫分類
- 產生媒體庫分類
media-category:generate {數量?}預設1 {--app}是否為網站媒體庫分類 {--user=}使用者id
8.6 Permission
- 重新安裝所有角色與權限,當data-presets檔內有修改權限的話可用這個指令重新安裝,會將原本有的重新對應權限給角色
permission:reinstall
9. 媒體庫
後台使用者共用媒體庫圖片
10. 後台選單架構
10.1 建立選單的流程
- 於
app/Http/Controllers/Admin/Menu/下依照原有結構去建立資料夾及Controller,一個Menu項目建立一個Controller - 每個Controller皆繼承
App\Http\Controllers\Admin\Menu\BaseMenuItemController - Controller內填入
name(選單名稱,可支援翻譯路徑表示法)slug(選單項目唯一名稱,不可重複)permissions(選填,設定後台選單項目的權限,須有權限才能看得到項目及進去頁面,如果有子母選單,則要看到子選單,必須要有母選單的權限才行,子選單也可獨立設定權限,這樣就兩個權限都要符合才行)iconClasses(選填,選單項目圖示的class, 可為陣列或字串)badge(選填,Bootstrap的badge)type(badge類型) secondary、dange、success等等label(badge的文字內容)isPill(是否為橢圓形)
- 繼承"handle" method,處理進去選單項目時的動作,如果是母選單項目可不設,因為母選單點下去就只是展開子選單而已,不會有動作
- 在
config/admin.php的menuItems內填入新增的Controller
type支援item、title(文字)、divider(分隔線),參考
App\Presenters\Admin\MainMenuItemPresenter
10.2 相關類別
- App\Services\Admin\MainMenuItemService
Singleton Instance,建構及儲存Menu項目的資料
- App\Provider\AdminMenuServiceProvider
讀取config/admin.php中的menuItems設定,建立route與儲存到MainMenuItemService
- App\Presenters\Admin\MainMenuItemPresenter
根據MainMenuItemService內儲存的Menu資料,建構Html
-
App\Http\Middleware\CheckAdminMenuPagePermission
檢查Admin選單項目的route權限
11. 後台"設定"頁面及程式架構
11.1 新增一個設定子頁面的流程
-
於
config/app.php的options內設定頁面的slug及頁面下面有哪些選項'page_slug' => [ // 頁面slug 'permission': 'admin manage options page_slug' // OptionsController的gate 'option_1' => [ // 選項slug,實際儲存在資料庫中的key 'type' => 'checkbox', // 選填,預設值為input text,選項的類型,支援的類型參考`App\Presenters\Admin\OptionFormFieldsPresenter` 'label(選項的名稱)' => 'abc', // 翻譯的字串,定義在lang/form.php內的labels 'validator' => 'required|min:8', // 選填,選項更新時的後端驗證規則,此為Laravel Validator的規則 'required' => true, // 選填,選項輸入欄位的html中的required屬性, ] ] -
建立設定頁面的
選單項目Controller,在App\Http\Controller\Admin\Menu\Options\Children,並加入至config
11.2 相關類別
- App\Providers\OptionRouteServiceProvider
建立儲存選項時的Route
- App\Http\Controllers\Admin\OptionsController
儲存選項時的 Route Controller
12. MiddlWare
- App\Http\Middleware\AdminAreaGuard
判斷後台權限
- App\Http\Middlwware\CheckAdminMenuPagePermission
檢查Admin選單項目的route權限
- App\Http\Middleware\DebugbarEnabler
開啟或關閉debugbar並處理
- App\Http\Middlware\SetAppLanguage
設定網站語系
-
App\Http\Middleware\SetSiteStates
設定SiteStateService中的資料
13. Service
- App\Services\AppJsObjectService
提供資料給前端js使用
- App\Services\MediaFileFactoryService
產生假的媒體檔案
-
App\Services\SiteStateService
紀錄全域的網站狀態
14. Service Provider
- App\Providers\AdminMenuServiceProvider
從Config檔案建立Menu Item,並註冊相關Route
- App\Providers\OptionRouteServiceProvider
建立後台設定頁面的route
-
App\Providers\SingletonServiceProvider
初始化所有singleton class 的 instance
15. 資料表 & Model
- disks Disk
本機儲存位置,定義在config/filesystems.php
- media_categories MediaCategory
媒體分類
- media_files MediaFile
媒體檔案
- media_sources MediaSource
外部媒體來源
- model_translations ModelTranslation
Model的翻譯
- options Option
設定選項
- users User
使用者
- password_resets
重設密碼的tokens
- model_has_permissions
model的權限,給spatie/laravel-permission套件使用的table
- model_has_roles
model的角色,給spatie/laravel-permission套件使用的table
- permissions
權限,給spatie/laravel-permission套件使用的table
- roles
角色,給spatie/laravel-permission套件使用的table
- role_has_permissions
角色的能力,給spatie/laravel-permission套件使用的table
16. Model
- App\TranslatableModel
被繼承用,需要翻譯的Model,繼承的Model要設定需要被翻譯的屬性
-
App\Post
被繼承用,為各文章類型的Parent Model
17. 文章類型
建立文章類型的流程
- 建立Model,繼承App\Post
- 建立migration,基本屬性可使用App\Traits\PostBlueprintGettable:processSchema(),傳入Blueprint
- 加入文章類型至
/config/postTypes.php - 加入選單項目(參考現有),後台管理功能和模板會自動共用
18. Event及Listener
用來在Model產生特定資料庫操作動作(增刪修)後做特定的事情
例如
- Media刪除後須跟著刪除檔案
- 可翻譯的Model被刪除後須跟著刪除翻譯資料
17.1 類別
-
App\Event
Model做特定動作之後會發出的Event
-
App\Listeners
發出Event之後要做的動作
-
App\Observers
觀察Model並在Model做特定動作之後要做的動作
17.2 使用方法
Event
- 新增一個Event
- 新增一個Listener
- 在Model內註冊event
- 在EventServiceProvider內註冊Event對應的Listener
- 在Event內設定Event發生的主體Model
- 在Listener內處理要做的事情
Observer
- 新增一個Oberserver
- 在Model內註冊Observer
- 在Observer內處理要做的事情