整合 Laravel
昨天導入 Composer 主要是為了今天要整合 Laravel 前的準備。
今天要先初始化 Laravel 專案,再把兩個專案合併,只要處理合併後的問題即可。
以本專案為例,合併過程中,需注意幾件事:
tests
資料夾有重覆,不過這問題並不大,把本專案的範例移到 Laravel Unit 底下即可phpunit.xml
也有重覆,不過只是 const 設定的問題。- 因為要使用 Laravel Router,所以在啟動服務時,必須改用 Laravel 起服務的方法:
php artisan serve
composer.json
需要以 Laravel 為基準合併,合併的重點是autoload
最大的問題應該在 composer.json
的 autoload
,內容參考如下:
"autoload": { |
基本上不難,調整好就可以安裝了
$ composer install |
要注意的是,Laravel 新專案剛建立時,有幾件事需要先做的:
- 初始化
.env
:cp .env.example .env
- 建立 APP_KEY:
php artisan key:generate
- 調整 storage 權限:
chmod 777 -R storage
到目前為止,就可以執行單元測試了:
$ php vendor/bin/phpunit |
整合原有程式
這太容易了!把 routes/web.php
打開,改成這樣就行了:
Route::get('/', function () { |
實際執行會遇到一點路徑上的問題:
include(/Users/miles.chou/GitHub/MilesChou/book-refactoring-30-days/public/class/Smarty/Smarty.class.php): failed to open stream: No such file or directory |
這是原本的 ROOT_PATH
寫法不是很好,可以改用 Laravel 所提供的 base_path
函式:
define('CLASS_PATH', base_path('/class/')); |
最後把 index.php
裡的 include
改成 require_once
,不然載入的時候會遇到重覆定義的錯誤訊息:
Cannot declare class db, because the name is already in use |
處理完這個錯誤,接著會發現一個使用 Smarty 的慘案:
The each() function is deprecated. This message will be suppressed on further calls |
PHP 7.2 不支援 each()
function,所以只能降級使用 PHP 7.1 開發。
解決完就能看到 HTML 了,但沒有 css/js,因為都放在主目錄,移到 public 目錄下即可。
管理頁面做法一樣,先加 route:
Route::get('/admin', function () { |
然後把載入改成 require_once
就沒問題了。
到目前為止,使用 Laravel 啟動服務就能看到跟原本首頁一樣的畫面了:
$ php artisan serve |
程式碼可以參考 GitHub PR