# Laravel 操作教學 Laravel是一套簡潔、優雅的PHPWeb開發框架 Laravel是易於理解且強大的,他提供了強大的工具用以開發大型、可靠的應用。具有驗證、路徑、Session、緩存、資料庫遷移工具、單元測試等常用工具和功能 長期支援 (英語:Long-term support,縮寫:LTS)是一種軟體的產品生命週期政策,特別是開源軟體,它增加了軟體開發過程及軟體版本週期的可靠度。長期支援延長了軟體維護的週期;它也改變了軟體更新(修補程式)的類型及頻率以降低風險、費用及軟體部署的中斷時間,同時提升了軟體的可靠性。但這並不必然包含技術支援。 特點: (1) 單入口,所有的請求必須從單一入口開始,主要是便於管理(統一的參數過濾) (2) MVC的思想(分層思想,主要是為了協同開發,實現後期的維護方便) (3) ORM操作資料庫 <font color=#FF0000>**注意:**</font>Laravel框架有一個特點,所有的URL訪問都必須事先定好路徑規則 >資料來源:[維基百科:長期支持](https://zh.wikipedia.org/zh-tw/%E9%95%B7%E6%9C%9F%E6%94%AF%E6%8F%B4)、[Laravel官網](https://laravel.com/docs/11.x) ## 1-1 Wampserver 和 XAMPP 前置動作 PHP區塊 建議安裝Wampserver 下載網址:[Wampserver官方網站](https://www.wampserver.com/en/download-wampserver-64bits/) 因為我們的資料庫是SQL Server,所以需要下載PHP擴展插件 下載網址:[微軟SQL Server文件](https://learn.microsoft.com/zh-tw/sql/connect/php/download-drivers-php-sql-server?view=sql-server-ver16) 下載後須按照PHP版本需求放入到php/ext資料夾裡 <font color=#FF6600>**條件要求:**</font> PHP >= 5.6.4 <-版本建議7.*以上 組長PHP版本為:8.2.13 OpenSSL PHP Extension PDO PHP Extension Mbstring PHP Extension Tokenizer PHP Extension XML PHP Extension <font color=#FF6600>**php.ini配置文件:**</font> extension=openssl.dll extension=zip extension=intl extension=pdo_mysql.dll (預設要開,不過我們的資料庫不是mysql而是SQLSRV) extension=php_sqlsrv_82_ts_x64 extension=php_pdo_sqlsrv_82_ts_x64 extension=mbstring.dll extension=fileinfo.dll(驗證碼代碼需要該擴展) extension=curl.dll(主要用於請求的發送) <font color=#FF0000>**注意事項!!**</font> XAMPP少部分會遇到錯誤的情況只需要關閉 ;extension=php_openssl.dll,在前面加個分號即可 Apache區塊 Laravel 包含 public/.htaccess 檔案,提供無需顯示 index.php 前端控制器的優雅 URL。當 Laravel 架設於 Apache 時,確認您的伺服器已啟用 mod_rewrite 模組,則 .htaccess 檔案會被啟用。 <font color=#FF6600>**Httpd.conf配置文件:**</font> LoadModule deflate module modules/mod_deflate.so LoadModule rewrite module modules/mod_rewrite.so ## 1-2 PHP添加環境變數 1. 在PHP安裝好之後需要將php.exe的位置的目錄添加到環境變數中(如果之前有加入別的版本的php.exe環境變數則需要刪除) 2. 要確保在添加環境變數後,能再命令提示框(CMD)運作”php -v”運行版本得結果中php版本號與實際運作的版本相符合 將php增加到環境變數裡 ![環境變數](https://hackmd.io/_uploads/S13vcsCk0.png) 在CMD裡運行php-v ![執行php-v](https://hackmd.io/_uploads/BkVEss0JR.png) ## 2-1 Composer 安裝及簡介 Composer是php用來管理依賴(dependency)關係的工具,你可以在自己的項目中聲明所依賴的外部工具庫(libraries),composer會幫您安裝這些依賴的資源 PS:很像是設定裡的應用程式一樣 要安裝Composer才能正常使用 下載網址:[Composer官方網站](https://getcomposer.org/) >備註:雖然官方有已經用好的壓縮包版本,但不太建議使用! 1. 下載完後直接安裝即可但要注意!! ![螢幕擷取畫面 2024-04-06 190804](https://hackmd.io/_uploads/BksQpsAJC.png) 2. 不需要使用代理 ![螢幕擷取畫面 2024-04-06 190908](https://hackmd.io/_uploads/BkqvajA1C.png) 3. 安裝完畢後請在CMD裡輸入composer來驗證是否安裝成功 ![驗證composer](https://hackmd.io/_uploads/H1Vi6sAJ0.png) ## 2-2Composer 指令介紹與鏡像切換 為了確保大家不會下載很久我們需要切換鏡像,預設的下載入口端都會 在國外伺服器上面 ,這裡我們可以選擇離我們比較近的日本來當我們的入口! 日本鏡像:[Packagist.JP](https://packagist.jp/?fbclid=IwAR0PAhmYIZDLXAfYnW5PN_HpAos7NaaVWKgqXs0c6vnkMQkSvP__YNSwazU) 使用方法: enable(開啟) ``` $ composer config -g repos.packagist composer https://packagist.jp ``` disable(關閉) ``` $ composer config -g --unset repos.packagist ``` ## 3-1 Laravel 專案創建教學 1. 創建Laravel專案 (最新版本) ``` composer create-project laravel/laravel --prefer-dist ./自定義資料夾名稱 ``` 命令解釋: composer 表示執行composer程式 create-project 通過composer創建專案 laravel/Laravel 需要創建的項目名稱 --prefer-dist 優先下載壓縮檔的方式,而不是直接從github上下載源代碼(複製) ./ 表示創建的項目目錄名稱,也可以是一個目錄名稱 ./為目前目錄 PS:./後面要加目錄名稱,默認是最新的版本 2. 創建Laravel專案 (指定版本) ``` composer create-project laravel/laravel=10.* --prefer-dist ./自定義資料夾名稱 ``` Laravel版本:[Laravel官網](https://laravel.com/docs/11.x/releases) PS:盡量不要使用最新的版本,怕會有Bug!! 3. 更新Composer (基本不太會用到) ``` composer self-update ``` ## 3-2 Laravel目錄結構 1. APP:專案的核心目錄,主要用於存放核心代碼,也包刮控制器、模型 2. Bootstrap:Laravel啟動目錄,存放框架啟動的時候需要的文件 3. Config:專案的配置文件,主要存放配置文件,比如資料庫的配置,存放框架的配置文件 比較重要的子文件 App.php:主要配置文件 Auth.php:用於定義用戶認證(登入)的配置文件 Database.php:資料庫的文件 Filesystems.php:上傳文件,文件文儲需要使用到的配置文件 4. Database:資料庫遷移文件 migrations儲存跟資料庫相關的操作文件(遷移文件【創建資料表類的文件】) 5. Public:專案的入口文件和系統的靜態資料目錄(基本可以不用動) 6. Resources:目錄包含你的view、以及原始的、未編譯的資源文件,例如CSS、JAVASCRIPT等 7. Route:是定義路徑的目錄,web.php是定義路徑的文件 8. Storage:主要是存放緩存文件和日誌文件,注意,如果是在Linux環境下,該目錄需要有可寫權限。(後期使用者上傳文件如果存在本地則也在storage目錄下) 9. Vender:(9) vender目錄,主要是存放第三方的類庫文件,Laravel思想主要是共同開發。 >參考資料:[Laravel目錄](https://laravel.com/docs/11.x/structure) ## 3-3 Laravel 啟動方式 <font color=#800080>**方法一:**</font>Laravel框架提供了簡單的方式啟動專案(相比配置Apche) 執行指令:php artisan serve <font color=#FF0000>**注意事項:**</font>一旦使用該方法是不能關閉小黑窗的(CMD),一旦關閉則伺服器也將關閉,網站就無法進入了!! <font color=#800080>**方法二:**</font>使用WAMP或XAMPP環境 <font color=#FF6600>**Httpd-vhost.conf虛擬主機配置:**</font> <VirtualHost *:80> #網站管理員電子郵件,當網站產生500錯誤的時候會顯示在頁面上 ServerAdmin koyori0314@gmail.com #網站需要綁定的網域名稱 ServerName www.koyori.com #伺服器的別名的域名 ServerAlias koyori.com #網站的根目錄 DocumentRoot "C:\Users\User\Documents\chtweb\public" #針對網站的詳細的配置 <Directory "C:\Users\User\Documents\chtweb\public/"> #本地 Options +Indexes +Includes +FollowSymLinks +MultiViews #公開會很危險 Options -Indexes #公開網與 Require all granted Options +Indexes +Includes +FollowSymLinks +MultiViews AllowOverride All Require local </Directory> </VirtualHost> **後要修改本機DNS設定:** 1. 先按快捷鍵Win+R 2. 輸入drivers 3. 找到Hosts文件,之後用記事本打開 <font color=#FF6600>**Hosts文件配置:**</font> # 127.0.0.1 localhost ::1 localhost 127.0.0.1 www.koyori.com koyori.com 127.0.0.1 www.konomi.com konomi.com (IP位置預設本機端 127.0.0.1) 自定義網域名稱 別名 <font color=#FF0000>**備註:**</font>現在取的網域名稱最好不要有網站用到要不然你開啟Wampserver時會發生網站被覆蓋的問題,別人也看不到這個網站,因為我們並沒有購買該網域。 ## 3-4 Laravel Route(路徑)教學 ### 3-4-1 路徑簡介 將使用者按照事先規劃的方案提交給控制器或功能函數來進行處理,在ThinkPHP框架中。當我們在URL地址中,傳遞p(平台platform)、c(控制器 controller)、a(方法 Approach)三個參數時,系統會自動跳轉指定模型中指定控制器的指定方法,這些處理過程中都是由框架自動完成的。但是在Laravel框架中,其實沒有指定固定參數,其路徑必須要手動進行配置 ### 3-4-2 定義路徑 1. 要先找到路徑檔案位置(routes/web.php) 2. 路徑定義格式 ```php //Route::請求方式(‘請求的URL’,匿名函數或控制響應的方法) Route::get('/home', function () { echo '當前訪問的地址是/home'; }); //any語法 //Route::請求方式('請求的URL',匿名函數或控制響應的方法) Route::any('/test1', function () { echo '當前訪問的地址是/test1'; }); //match語法 //Route::請求方式([請求類型],'請求的URL',匿名函數或控制響應的方法) Route::match(['get', 'post'], '/test2', function () { echo '當前訪問的地址是/test2'; }); ``` 目前官方定義的路徑方法 ```php Route::get($uri, $callback); Route::post($uri, $callback); Route::put($uri, $callback); Route::patch($uri, $callback); Route::delete($uri, $callback); Route::options($uri, $callback); ``` >參考資料:[Laravel路徑](https://laravel.com/docs/11.x/routing) ### 3-4-3 路徑參數 路徑參數其實就是給路徑傳遞參數 參數分為必選參數和可選參數 路徑參數的傳遞通過路徑地址中的”{參數名}”的形式來進行傳遞,該刑式是必選參數的形式,可以選的則使用”{參數名?}” 備註:除了通過自訂義路徑的方式來傳遞路由參數以外,還可以通過”?”形式傳遞 參數例如: http://www.koyori.com/user2?id=12345 ```php //必選參數 Route::any('test3/{id}', function ($id) { echo '當前的用戶ID為:' . $id; }); //可選參數 Route::any('test4/{name?}', function ($name = '') { echo '當前的用戶名為:' . $name; }); //通過?id形式傳遞get參數 Route::any('test5', function () { echo '當前的用戶ID為:' . $_GET['id']; ``` ### 3-4-4 路徑別名 路徑別名相當于在路徑定義的時候,為路徑取個別名,在以後的程式中可以通過這個別名來獲取路徑的訊息 例如: ```php //在Route結尾加上->name('自定義的別名') Route::any('test4/{name?}', function ($name = '') { echo '當前的用戶名為:' . $name; })->name('getname'); ``` 取別名的好處是之後有用到的時候不用書很長的路徑,之後在維護上會很方便。 也可透過CMD查詢目前有的路徑(php artisan route:list) ![螢幕擷取畫面 2024-04-06 233706](https://hackmd.io/_uploads/ryw4nJ1lR.png) ### 3-4-5 路徑群組 您在定義路徑的時候應該會發現有時後路徑的前驟都差不多 例如:管理員管理介面路徑定義如下 /admin/login /admin/logout /admin/index /admin/user/add /admin/user/list ..... 他們的共同點是,都有/admin做開頭,為了方便管理,可以把他們放到一個路徑群組中使用prefix屬性指定路徑開頭 例如:你想要為所有路徑URLs前面添加開頭為admin ```php //路徑群組 //語法:Route::group(公共群組,回調函數); Route::group(['prefix' => 'admin'], function () { Route::get('login', function () { // 匹配 "/admin/login" URL }); Route::get('logout', function () { // 匹配 "/admin/logout" URL }); Route::get('index', function () { // 匹配 "/admin/index" URL }); }); ``` ## 3-5 Laravel Controller(控制器)教學 ### 3-5-1 Laravel 控制器介紹 與其在路徑檔案中將所有請求處理邏輯定義為閉包,不如使用 "控制器" 類別來組織這些行為。控制器可以將相關的請求處理邏輯集中到一個類別。例如,UserController 類別可以處理所有與使用者相關的傳入請求,包括顯示、建立、更新和刪除使用者。預設情況下,控制器儲存在(app/Http/Controllers) 目錄中。 >參考資料:[Laravel控制器](https://laravel.com/docs/11.x/controllers) ### 3-5-2 Laravel 控制器使用教學 1. 控制器文件位置為(app/Http/Controllers) ![控制器](https://hackmd.io/_uploads/BJB753feR.png) 2. 控制器文件如何命名? 依造已經存在的文件來看可以得知其命名方式為大駝峰命名法 <font color=#0000FF>**大駝峰命名方式+Controller.php**</font> 備註:並不是檔名要加(+)符號 例如:如果要創建user的控制器,檔案名稱應該要取為UserController.php >參考資料:[維基百科:大駝峰命名法](https://zh.wikipedia.org/zh-tw/%E9%A7%9D%E5%B3%B0%E5%BC%8F%E5%A4%A7%E5%B0%8F%E5%AF%AB) 3. 結構代碼如何編寫? 注意:其控制器基礎結構代碼,不需要自己編寫,可通過Laravel自帶指令自動生成。 創建控制器指令為:(需要記住此指令) ``` php artisan make:controller 控制器名稱(大駝峰)Controller ``` 使用範例:使用artisan指令創建UserController.php文件 ``` php artisan make:controller UserController ``` 以下為已經寫好的內容: ```php namespace App\Http\Controllers; use Illuminate\Http\Request; class JobTitleController extends Controller { // } ``` 創建好的文件: ![創好的文件目錄](https://hackmd.io/_uploads/rJ9FpnfgA.png) 4. 控制器在路徑如何編寫? 如何使用路徑規則調用控制器的方法,而不是走回調函數路徑設置格式基本相同,只是匿名函數轉換成『控制器名稱@方法』 定義格式如下: ```php Route::請求方法(路徑表達式,控制器名稱@方法) ``` 例如:在User控制器中創建test1方法,其中輸出phpinfo訊息 UserController.php文件 ```php namespace App\Http\Controllers; use Illuminate\Http\Request; //命名空間三元素:常量、方法、類別 class UserController extends Controller { //測試控制器路徑使用 public function test1() { return phpinfo(); } } ``` 編輯路徑規則:(web.php) ```php use App\Http\Controllers\UserController; //設定路徑: Route::get('user/test1',[UserController::class,'test1']); ``` ### 3-5-3 Laravel 控制器分目錄管理 1. <font color=#FF0000>**問:**</font>是否可以進行分目錄管理? <font color=#FF0000>**答:**</font>可以 2. 要如何進行分目錄管理? 例如:需要創建前端和後端,在創建平台建立IndexController和在後端創平台創建IndexController 1. 建立好分目錄 ![分目錄](https://hackmd.io/_uploads/HyETmpMxR.png) 2. 創建控制器文件(使用artisan指令創建) 在創建的時候需要在指令輸入控制器所存放的目錄 例如: ``` php artisan make:controller Admin<-目錄名稱/IndexController<-控制器名稱 php artisan make:controller home<-目錄名稱/IndexController<-控制器名稱 ``` 創建成功畫面: ![創建控制器成功](https://hackmd.io/_uploads/HJLAEpGeA.png) 前端IndexController.php編輯畫面(Crotollers/Hone) ```php namespace App\Http\Controllers\Home; //<-這時你會發現Home路徑已經自動填上,這意味著我們不需要自行填寫路徑 use Illuminate\Http\Request; class IndexController extends Controller { //前端 public function index() { echo "歡迎來到前端葉面"; } } ``` <font color=#FF0000>**注意:**</font>這些都是artisan都會幫您自動創建好都不需要去更改 3. 設定路徑 還記得Laravel的精隨吧,所有東西都是要依賴路徑才能運作的,所以這裡我們也要設定路徑 路徑文件(web.php) ```php //在使用控制器時都需要先添加 use App\Http\Controllers\Admin\IndexController asAdminIndexController; //添加控制器時可以為其設置別名alian以方便之後辨認, //因為有兩個IndexController如果不設置別名 //可能會找不到要用哪個,所以養成好習慣要設置別名 use App\Http\Controllers\Home\IndexController; //控制器分目錄路徑 Route::get('/home/index',[IndexController::class,'index']); Route::get('/admin/index',[AdminIndexController::class,'index']); ``` ## 3-6 Laravel 資料庫 現在的網站都會有資料庫還做配合,理所當然Laravl也支援資料庫,目前支援的資料庫有以下幾總: * MariaDB * MySQL * PostgreSQL * SQLite * SQL Server Laravel 使用原始 SQL、流暢的查詢建構器和 Eloquent ORM 讓與資料庫的互動變得極為簡單,跨各種支援的資料庫。 ### 3-6-1 資料庫環境設定設定 首先要打開.env檔案 以下是.env檔案內的資料庫設定檔案 ``` DB_CONNECTION=sqlsrv 要使用哪種資料庫 DB_HOST=127.0.0.1 伺服器IP位址 DB_PORT=1433 端口 DB_DATABASE=chtdata 資料庫名稱 DB_USERNAME=koyori**** 使用者帳號 DB_PASSWORD=************ 使用者密碼 ``` 備註:如果要用自己的SQL Server不用改IP位址,只需要改DB_CONNECTION、DB_DATABASE、帳號密碼,如果要用伺服器資料庫請參考:[資料庫連線設定](https://docs.google.com/document/d/11G84V4TdgFslxB8ZgEoIeBa5P_ztbFOO/edit?rtpof=true#heading=h.gjdgxs),SQL Server預設端口是1433,基本上是進得去的,如果沒有更改的話! ### 3-6-2 如何創建Migrations資料表轉移檔 1. Laravel指令創建 ``` php artisan make:migration create_flights(中間換成你想要取的名子 )_table ``` 舉例我想要創建customers_contacts資料表 打開CMD打上 ``` php artisan make:migration create_customers_contacts_table ``` 如果創建成功會出現Successfully ![螢幕擷取畫面 2024-04-27 201317](https://hackmd.io/_uploads/rJgG2DcbA.png) ### 3-6-3 Migrations資料表改寫 創建完的預設格式 ```php <?php use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; return new class extends Migration { /** * Run the migrations. */ public function up(): void { Schema::create('customers_contacts', function (Blueprint $table) { $table->id(); $table->timestamps(); }); } /** * Reverse the migrations. */ public function down(): void { Schema::dropIfExists('customers_contacts'); } }; ``` 編寫方法 $ table->string('中間放欄位名稱')->其餘條件例如是否為空值或自動識別。 //固定$table在前 之後接格式可以參考:[Laravel官網](https://laravel.com/docs/11.x/migrations) ## 3-7-1 Model介紹 基本上Laravel的正確 備註:Laravel Model 介紹 ``` php artisan make:model 模型名稱 ``` 備註:取名方式為大駝峰取名法 劇情情境:您要創建員工資料表模型就是Employee 指令:php artisan make:model Employee 創建完成的預設格式 ```php <?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class Employee extends Model { // use HasFactory; protected $table = 'employees'; //資料表 protected $primaryKey = 'emp_number'; //主鍵 protected $fillable = [ 'emp_id', 'emp_name', 'emp_gender', 'emp_born', 'emp_phone', 'emp_cellphone', 'emp_extension', 'emp_email', 'emp_sal_base', 'emp_performance', 'emp_allowance', 'emp_hiredate', 'emp_leavedate', 'emp_newdate', 'emp_idnumber', 'emp_address', 'emp_location', 'emp_changedate', 'dep_number', 'job_ra_number', 'job_number' ]; //資料表欄位,但不含主鍵 public $timestamps = false; //有沒有時間戳,大部分我們自己的資料表示沒有所以預 設false } ``` 注意事項:以上變數都是固定的請不要亂更改