這篇用來記錄一下可能會踩到的坑,以及發現到的知識點。 --- # 前置作業 Lamp 環境可以參考[這篇教學](https://hackmd.io/@monkenWu/SyxEisueB),下方列出環境設定的不同處 * 沒有安裝 phpMyAdmin,改用其他 DBMS * PHP 選用 `8.2` 版 * Composer 使用[官方指令](https://getcomposer.org/download/) ### Lamp * [Linux](https://distrowatch.com) * [Apache](https://httpd.apache.org) * [MySQL](https://www.mysql.com/)、[MariaDB](https://mariadb.org/) * [PHP](https://www.php.net)、[Python](https://www.python.org) Windows 底下除了建置 wamp 以外,亦可以使用 [Xampp](https://www.apachefriends.org/zh_tw/index.html) 在使用 [Laravel](https://laravel.com) 前,得先安裝 [Composer](https://getcomposer.org) (PHP 的套件管理工具) ```bash! sudo apt update sudo apt upgrade -y php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" php -r "if (hash_file('sha384', 'composer-setup.php') === 'dac665fdc30fdd8ec78b38b9800061b4150413ff2e3b6f88543c636f7cd84f6db9189d43a81e5503cda447da73c7e5b6') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;" php composer-setup.php php -r "unlink('composer-setup.php');" ``` 安裝完成後,將 `phar` 檔移至 `PATH` ```bash sudo mv composer.phar /usr/local/bin/composer ``` 透過官方提供的指令,建立新的專案 ```bash composer create-project laravel/laravel:^10.0 example-app cd example-app ``` # CRUD 實作 ( Create, Read, Update, Delete ) ## MVC 模型圖 ![Pasted image 20240401122052](https://hackmd.io/_uploads/BySsQGiyA.png) 截自 [Laravel CRUD in 50 minutes for Beginners from Scratch](https://youtu.be/_LA9QsgJ0bw?si=dilA1Vdf2_ElbSLT) 我覺得這部很易懂,實作筆記基本從這來的,推薦跟著跑一遍流程 :::info ### 建立新專案 ```bash! composer create-projdect laravel/laravel --prefer-dist <project_name> "<laravel_verison>" ``` 建立完後,cd 到專案目錄開啟 VSCode --- ### Run Server Laravel 內建 Server 啟動工具,URL 預設會掛在 127.0.0.1:8000 下 ```bash php artisan serve ``` MariaDB 在 WSL 的啟動指令 ```bash sudo service mysql start sudo service mysql stop sudo service mysql restart ``` --- ### Database * Laravel 設定檔 (.env) `DB_DATABASE` 改成你的專案名稱 `DB_PASSWORD` 沒設定密碼就留空 <br> * 建立資料表 & 整合資料庫 ```bash php artisan make:migrate <table_name> php artisan migrate ``` <br> 整體用法類似 git,將要新增/修改內容的操作,透過 Laravel migrate 工具來管理。 創好資料表後可以設定類似以下的內容 ( /database/migrations/<table_name> ) ```php! public function up(): void { Schema::create('<table_name>', funciton (Blueprint $table) { $table->id(); $table->string('user_name'); $table->interger('total_cost'); $table->decimal('each_price'); $table->text('description'); $table->timestamps(); }); } ``` 資料庫可以使用 phpMyAdmin 來管理資料 不過我選擇 VSCode 的 [Database Client](https://database-client.com) 套件來操作 ::: --- # 頁面顯示 ### Controller ```php! public funciton index(){ $model_items = ModelName::all(); return view('<path>.<blade_name>', ['model_items', $model_items]) /* eg. dir/index.blade.php => dir.index */ } ``` ### Routes ```php! /* 陣列第二元素 = Controller 裡的 Function 名稱 name 則是 Path + Function Name => Route Name */ Route::get('/<path>', [ControllerName::class, 'index'])->name('<path>.index'); ``` ### Blade 透過 Controller 轉發,將資料帶過來後,可在表單中帶入資料 ```php! @foreach($model_items as $item) <tr> <td>{{$item->id}}</td> <td>{{$item->name}}</td> <td>{{$item->price}}</td> </tr> @endforeach ``` ## 新增 在 B 頁面表單中,將資料以 post 發給 Route,之後從 B 頁面帶回 A 頁面 ### Controller ```php! public function create(Request $request){ // 若要攔截顯示 BUG 可用 validateWithBag $validated = $request->validate([ 'name' => 'required', 'price' => 'required|decimal:0,2' ]); $newItem = ModelName::create($validated); return redirect(route('<Route_Name>')); } ``` ### Routes ```php! Route::post('/<path>', [ControllerName::class, 'create'])->name('<path>.create'); ``` ### Blade ```php! <form method="post" action="{{route('<Route_Name>')}}"> @csrf @method('post') <div> <label>Name</label> <input type="text" name="name" placeholder="Name"/> </div> <div> <label>Price</label> <input type="text" name="price" placeholder="Price"/> </div> <div> <input type="submit" value="Create a new item"> </div> </form> ``` ## 編輯 分成兩部份,先取得資料後發送更新請求。 ### Controller ```php! public function edit(ModelName $model){ return view('<path>.edit', ['item' => $model]); } public function update(Request $request, ModelName $model){ $data = $request->validate([ 'name' => 'required', 'price' => 'required|decimal:0,2' ]); $model->update($data); return redirect(route('<Route_Name>')); } ``` ### Routes ```php! Route::get('/<path>', [ContronllerName::class, 'edit'])->name('<path>.edit'); Route::put('/<path>', [ContronllerName::class, 'update'])->name('<path>.update'); ``` ### Blade 路由轉發用的編輯按鈕 ```php! @foreach($model_items as $item) <tr> <td>{{$item->id}}</td> <td>{{$item->name}}</td> <td>{{$item->price}}</td> <td> <form method="post" action="{{route('<path>.edit', ['model' => $item])}}"> @csrf @method('get') <input type="submit" value="Edit"> </form> </td> </tr> @endforeach ``` 編輯頁面 ```php! <form method="post" action="{{route('<path>.update', ['model' => $item])}}"> @csrf @method('put') <div> <label>Name</label> <input type="text" name="name" value="{{$item->name}}"/> </div> <div> <label>Price</label> <input type="text" name="price" value="{{$item->price}}"/> </div> <div> <input type="submit" value="Update"> </div> </form> ``` ## 刪除 ### Controller ```php! public function delData(ModelName $model){ $model->delete(); return redirect(route('<path>.index')); } ``` ### Routes ```php! Route::delete('/<path>', [ControllerName::class, 'delData'])->name('<path>.del'); ``` ### Blade 路由轉發用的刪除按鈕 ```php! @foreach($model_items as $item) <tr> <td>{{$item->id}}</td> <td>{{$item->name}}</td> <td>{{$item->price}}</td> <td> <form method="post" action="{{route('<path>.del', ['model' => $item])}}"> @csrf @method('delete') <input type="submit" value="Delete"> </form> </td> </tr> @endforeach ``` --- # 更多指令 在專案越來越龐大之後會需要更細的分工,如:Repository、Service ...等 然而原生 Laravel 工具集中沒有包含自動生成這些檔案的指令,因此需要安裝第三方工具集 本文選用:[Laravel More Command](https://github.com/theanik/laravel-more-command) 能夠生成 Repository、Repository with Interface、Service、Trait、View(blade file)、Clear Log,且使用指令的格式與原生 `php artisan` 一樣 ### 安裝 ```bash composer require theanik/laravel-more-command --dev ``` 或是在 composer.json 中的 `require-dev` 加入下方內容,並執行 `composer update` ```json "require-dev": { "theanik/laravel-more-command": "^1.3.0" } ``` ### Make Repository 會自動在 **APP** 下建立 **Repositories** 資料夾 __生成 Repository:__ ```bash php artisan make:repository UserRepository ``` or ```bash php artisan make:repository Backend/UserRepository ``` __生成 Repository with Interface:__ ```bash php artisan make:repository UserRepository -i ``` or ```bash php artisan make:repository Backend/UserRepository -i ``` ### Make Service 會自動在 **APP** 下建立 **Services** 資料夾 __生成 Service:__ ```bash php artisan make:service UserService ``` or ```bash php artisan make:service Backend/UserService ``` ### Make View 會自動在 **APP** 下建立 **Blade** 資料夾 __生成 View:__ ```bash php artisan make:view index ``` or ```bash php artisan make:view user/index ``` ### Make Trait 會自動在 **APP** 下建立 **Traits** 資料夾 __生成 Trait:__ ```bash php artisan make:trait HasAuth ``` or ```bash php artisan make:trait Backend/HasAuth ``` ## Log Clear ```bash php artisan log:clear ``` > ※ 該指令會刪除 ***所有*** 在 `/storage/logs/` 下的資料!