# 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增加到環境變數裡

在CMD裡運行php-v

## 2-1 Composer 安裝及簡介
Composer是php用來管理依賴(dependency)關係的工具,你可以在自己的項目中聲明所依賴的外部工具庫(libraries),composer會幫您安裝這些依賴的資源
PS:很像是設定裡的應用程式一樣
要安裝Composer才能正常使用
下載網址:[Composer官方網站](https://getcomposer.org/)
>備註:雖然官方有已經用好的壓縮包版本,但不太建議使用!
1. 下載完後直接安裝即可但要注意!!

2. 不需要使用代理

3. 安裝完畢後請在CMD裡輸入composer來驗證是否安裝成功

## 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)

### 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)

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
{
//
}
```
創建好的文件:

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. 建立好分目錄

2. 創建控制器文件(使用artisan指令創建)
在創建的時候需要在指令輸入控制器所存放的目錄
例如:
```
php artisan make:controller Admin<-目錄名稱/IndexController<-控制器名稱
php artisan make:controller home<-目錄名稱/IndexController<-控制器名稱
```
創建成功畫面:

前端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

### 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
}
```
注意事項:以上變數都是固定的請不要亂更改