# Laravel 大補包(途中)
###### tags: `Laravel`
## 基礎
### MVC架構介紹
> 早在圖形使用介面(GUI)被發明出來的時候,工程師想怎麼去取得資料給使用者看的時候就開始使用這個方式,但是當時就是各做各的,也並沒有特別給予這個方式任何的命名。
MVC只是將這架構制式化,細節規定清楚,讓所有人照規則走都可以互相知道大家在幹嘛
>
> ~~他其實就像一個流程,就跟你在家裡炸薯條或速食店炸薯條。都要先熱油,再放入薯條,炸好再放鹽。但是每個人的習慣都不一樣,而速食店雖然做的事也差不多,但會建立確切SOP去指定的溫度,秒數,份量。確保大家都清楚知道該怎麼做,做出的成品也不會相差太遠。~~
### MVC架構解析
>Model、View、Controller 的區分,是希望能把應用程式的內部運作歸納成不同的部門,讓每個部門各自負責不同的關注點。具體的行為是「把不同意義的程式碼放在不同的檔案裡」。
>
>網頁開發導入MVC架構,能讓開發的過程中更明確的區分「邏輯處理」與「資料呈現」,明確的區分各元件的功能,提高系統的擴充性、可用性。此外,導入MVC更容易進行分工,團隊每個人可以在各自負責的部份進行開發,不會互相衝突或干擾。
> MVC其實就是分成三大部分,每個部份各司其職,互相溝通。
>
> 1. Model 負責資料庫的定義、管理、溝通
> 2. View 負責將處理完的資料呈現給使用者看
> 3. Controller 負責大部分的邏輯推算與資料處理
### 一個典型的MVC架構如果用圖片來表示如下,你使用Controller去操縱model去資料庫抓資料更新view給使用者看
![MCV_IMG]
> Reference:https://blog.techbridge.cc/2017/09/16/frontend-backend-mvc/
### 環境架設
1. Github建立Laravel的專案
2. Laravel安裝
3. gitignore
4. env
5. composer.json、composer.lock、package-lock.json、package.json
### Route
1. [Route是什麼](https://learnku.com/docs/laravel/7.x/routing/7458)
- [Http請求](https://developer.mozilla.org/zh-TW/docs/Web/HTTP/Methods)
2. Route實作
```php=
Route::get('網址', function () {
//返回的內容
return '回傳文字';
});
```
### View
1. [Blade是什麼](https://learnku.com/docs/laravel/7.x/blade/7470)
2. Blade實作
- HTML To Blade
- template 製作
- @extends()、@yield()、@section()
### Route、View組合
1. 利用route返回view
```php=
Route::get('網址', function () {
//回傳模板
return view('模板');
});
```
### 以模板方式製作最新消息
1. 最新消息列表頁
2. 最新消息內容頁
### Controller
1. 需要Controller的原因?
2. 如何產生Controller?
3. 如何利用Route連接Controller?
### Database、Migration
轉移表(Migration)有點像是資料庫(Datebase)的規格書(藍圖),可以用來定義資料庫有甚麼表單,欄位,格式,甚至表單之間的關聯性。而在laravel中,有提供Schema builder,這個套件會自動產生基本格式讓使用者建立表單更加方便。
那如何利用laravel建立有Schema builder的Migration呢?
1. 在終端機介面輸入指令,
在單純建立表單的狀態下只需要符合以下資訊
```php=
php artisan make:migration 表單名
```
2. 但為了建立表單時同時引用Schema builder就必須要這樣命名
(注意下方命名規則)
```php=
php artisan make:migration create_表單名_table
//表單名必須為s結尾(建議使用英文單字複數)
//表單名如有多個單字需用底線分隔
```
使用指令建立完表單之後,可以在/database/migrations裡面找到剛建立了migration表單,接下來就可以用Migration來建立Datebase
3. 編輯migration
### ORM
將資料庫(的概念)給物件化,可以不用寫資料庫語言來操作資料庫的技術。
藉由laravel內建的ORM將PHP轉譯成資料庫語言。
但因為是轉譯也會有執行效率比較低的缺點。
- #### 批量赋值(mass-assignment)
顧名思義,他是將瀏覽器送來的資料以一個序列的方式來新增一筆資料,
雖然方便但也讓有心人士可以將有問題的資料一併傳入資料庫。
所以lavarel提供了兩種方法預防使用者自行填入他們本身不該填的欄位:
* $fillable (類似白名單的概念,寫在這裡面的欄位可以被寫入)
* $guarded (類似黑名單的概念,寫在這裡面的欄位就不會被寫入)
所以如果要讓所有數值都可以批量赋值,可以設定$guarded為空陣列。
```php
protected $guarded = [];
```
- #### 局部作用域(scope)
https://learnku.com/docs/laravel/8.x/eloquent/9406#f97e0f
- #### 排序 - 多次
```php
$users = DB::table('users')
->orderBy('name', 'desc')
->orderBy('email', 'asc')
->get();
```
- #### 排序 - 隨機
```php
$randomUser = DB::table('users')
->inRandomOrder()
->first();
```
- #### 查詢 - 條件語句(when)
用於想要在某個條件為真值時,才去做查詢
```php
$role = $request->input('role');
$users = DB::table('users')
->when($role, function ($query, $role) {
return $query->where('role_id', $role);
})
->get();
```
其它用法參考:https://learnku.com/docs/laravel/8.x/queries/9401#0aae9e
---
| 命名方式: | |
| --------- | ------------ |
| 大駝峰 | ProductList |
| 小駝峰 | productList |
| 底線 | product_list |
命名規則:
| Model: | Migration: | Controller: |Views:(不強制) | Function
| ------------------- | ---------------------- | ----------- | --- | --- |
| 1. 大駝峰 | 1. 底線連接單字(小寫) | 1.___Controller(大駝峰) | 1. 小寫 | 1. 小駝峰
| 2. 與表格名稱一致 | 2. 複數 | 2. 單數 | 2. 底線連接 | |
| 3. 單數|| |
| EX: History | EX: histories | EX: HistoryController | EX: history | |
| 建立一格聯絡我們(contact us): | migration | Model | Controller | view |
| ----------------------------- | -------------------------------------------------- | -------------------------------- | ----------------------------------------------- | -------------------------------------------------------- |
| 建立表格:命名 | php artisan make:migration create_contact_us_table | php artisan make:model ContactUs | php artisan make:controller ContactUsController | contact_us.blade.php資料夾名稱contact_us/index.blade.php |
| 路徑 | database/migrations/contact_us.php | app/ContactUs.php | app/Http/Controllers/ContactUsController | resources/views/contact_us.blade.php|
|功能描述|將資料使用程式碼與資料庫連結,執行表格CRUD相關操作|負責與資料庫建立溝通,限制資料的存取,建立資料表之間的關聯|與該網址相關之業務邏輯,負責透過Model與資料庫溝通存取資料,返回資料或頁面/route透過controller將資料回傳至前端頁面|畫面的模板
## [進階技巧](https://laravel.com/docs/8.x/helpers)
- ### 字串操作
#### 1.超過字數省略
- Srt:limit('字串',長度限制,'[繼續閱讀]')
```php=
use Illuminate\Support\Str;
$truncated = Str::limit('The quick brown fox jumps over the lazy dog', 20);
// The quick brown fox ...
$truncated = Str::limit('The quick brown fox jumps over the lazy dog', 20,['繼續閱讀']);
// The quick brown fox 繼續閱讀...
```
#### 2. 取得數組的第一個元素or 最後一個元素
- 第一個元素 head()
- 最後一個元素 last()
```php=
$array = [100,200,300]
$first = head($array);
// 100
$last = last($array);
// 300
```
#### 3. 取得給定字串中,抓取兩個字符串之間的所有內容
沒有找到指定的字串 則返回null
```php=
use Illuminate\Support\Str;
$slice = Str::between('My name is Inigo Montoya.', 'My name is ', '.');
// 'Inigo Montoya'
// 我喜歡用這種方式從 () 或 [] 之間獲取信息、返回 url 中的特定部分、甚至是從 html 標籤中解析數據。
```
#### 4.確認一個字符串中是否包含另一個字符串 在php中只能使用```strpos```
```php=
use Illuminate\Support\Str;
$contains = Str::contains('My name is Inigo Montoya.','Inigo');
// true
$contains = Str::contains('My name is Inigo Montoya.','Andrew');
// false
```
- ### 數組操作
#### 1. 遍歷多維數組並檢索給定鍵的所有值
```php=
use Illuminate\Support\Arr;
$array = [
['website' => ['id' => 1, 'url' => 'reddit.com']],
['website' => ['id' => 2, 'url' => 'twitter.com']],
['website' => ['id' => 3, 'url' => 'dev.to']],
];
$names = Arr::pluck($array, 'website.url');
// ['reddit.com', 'twitter.com', 'dev.to']
```
## 進階套件
>- ### [Google reCaptcha 機器人驗證](https://laravel-recaptcha-docs.biscolab.com/docs/installation)
>- ### [Carbon 時間套件](https://carbon.nesbot.com/docs/)
## 學習資源
>### 1.[Cheatsheet](https://learnku.com/docs/laravel-cheatsheet/8.x)
## 錯誤解決辦法
>### 1.[curl-ca-bundle.crt安裝](https://hackmd.io/EVozsepIRwCOl6rjn0Mnzw)
>### 2.
[MCV_IMG]:https://1.bp.blogspot.com/-8c5UQn8vOyo/TiLZAzt7TCI/AAAAAAAADd4/UBGvXx0gzM0/s1600/mvc-rails.png "mvc =500x550"
```mermaid
graph TD
A-->B
```