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