iT邦幫忙

2021 iThome 鐵人賽

DAY 14
0
自我挑戰組

PHP 與 Laravel 雜記系列 第 14

Laravel 的 MVC 與 Router

Laravel 的 MVC 架構

Laravel MVC 架構
Controller 負責接收並處理由 Routes 轉發來的請求(request)
Model 負責資料業務邏輯與資料庫交互
View 負責資料渲染和前端頁面互動
使用者輸入 URL 到 server 然後經過 web 應用程式的 routes 部分, 來決定由哪一個 controller 處理請求, 然後 controller 裡決定決定執行何種業務邏輯, 業務邏輯實際執行經由 model 完成, 執行業務邏輯的中間可能會連接資料庫, controller 得到 model 執行完業務邏輯後的資料後, 將相關資料傳給 view 去渲染畫面給使用者, 以目前前後端分離開發模式來說, controller 會將得到的資料直接回傳給前端團隊開發的端模組, view 的部分就不用了.

Laravel routes 的使用

laravel routes 的定義都放在 routes 目錄下, 可以使用 artisan 指令查看目前的所有路由映射

php artisan route:list ## 查看目前的路由

Routes.png
Method 欄位表示接受的請求方式(request method), URI 欄位就是請求路徑, Action 欄位代表相對應的處理, Middleware 欄位表示會經過的中介軟體
我們可以打開 routes/app.php, routes/web.php

<?php
// web.php
use Illuminate\Support\Facades\Route;
// 使用 Route Facade 來定義路由, Facade 是 Laravel 提供的靜態代理
// 這裡的 get 表示 method, 支持所有的 HTTP Method, 可以用 any 表所有方式
Route::get('/', function () {  
    return view('welcome');    // 這裡定義了路徑 "/", 相關處理為一個閉包(Closure)
});
<?php
// api.php
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
// 先經過中介軟體 auth:sanctum, auth 是中介軟體, 冒號後面的 sanctum 代表參數, 
Route::middleware('auth:sanctum')->get('/user', function (Request $request) {
    return $request->user();   
});
// 這裡也定義相關處理為一個閉包, 但看路徑定義是 /user, 怎麼當初指令顯示的是 api/user
// 這裡只是定義了路由服務, 我們要註冊到對應的 srever container裡面在能用, 
// 也就是 app/Providers/RouteServiceProvider.php 這個檔案有關, 
<?php
// RouteServiceProvider.php
// 這裡只擷取註冊服務相關的 boot 方法

public function boot()
    {
        $this->configureRateLimiting();

        $this->routes(function () {
            Route::prefix('api')    // 這裡定義了前綴 api, 所以真正的路徑會是 api/user
                ->middleware('api')
                ->namespace($this->namespace)
                ->group(base_path('routes/api.php'));

            Route::middleware('web')
                ->namespace($this->namespace)
                ->group(base_path('routes/web.php'));
        });
    }

Laravel route 也可以設定重新導向, 301 永久重新導向, 302 臨時重新導向, 重新導向搜索引擎會收錄重新導向前的地址, 永久重新導向則是收錄重新導向後的地址, 這會影響 SEO

<?php
Route::get('here', function () {
  return '重新導向前';
}); 
Route::get('there', function () {
  return '重新導向後';
}); 
Route::permanentRedirect('here', 'there');  // 永久
Route::redirect('here', 'there'); // 臨時

上一篇
第一次接觸 Laravel
系列文
PHP 與 Laravel 雜記14

尚未有邦友留言

立即登入留言