---
# System prepended metadata

title: Laravel 操作教學

---

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




