首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

CodeIgniter 3/4 MVC 與單一入口機制深度解析

     編輯:PHP 相關知識

單一入口模式

所有 HTTP 請求導向唯一入口腳本 public/index.php(CI4)或 index.php(CI3)。Web 伺服器重寫規則(Nginx/Apache)將非實體檔案請求轉發給入口:

# Nginx
location / {
    try_files $uri $uri/ /index.php?$query_string;
}

# Apache .htaccess
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]

啟動流程

  1. index.php 載入 autoload.php(Composer)與框架核心 CodeIgniter.php。
  2. 建立 CodeIgniter\CodeIgniter 實例,執行 run()。
  3. 解析 URI、匹配路由(app/Config/Routes.php),決定控制器/方法/參數。
  4. 實例化控制器,呼叫 initController() 注入 Request/Response/Logger 等服務。
  5. 執行控制器方法,回傳 Response 物件(View、JSON、Redirect 等)。
  6. 輸出回應,觸發 terminate 事件,結束生命週期。

MVC 架構在 CodeIgniter 的實現

Model(模型)

  • CI3:繼承 CI_Model,透過 `$this->load->model('User_model')` 載入,使用 `$this->db` 查詢建構器/Active Record。
  • CI4:繼承 CodeIgniter\Model,內建 CRUD、驗證、時間戳自動管理、資料映射、軟刪除。
    範例:
<?php namespace App\Models;
use CodeIgniter\Model;

class UserModel extends Model {
    protected $table = 'users';
    protected $allowedFields = ['email', 'name', 'password_hash', 'is_active'];
    protected $useTimestamps = true;
    protected $createdField = 'created_at';
    protected $updatedField = 'updated_at';
    protected $dateFormat = 'datetime';

    public function findActiveByEmail(string $email): ?array {
        return $this->where('email', $email)->where('is_active', 1)->first();
    }
}

View(視圖)

  • CI3:`$this->load->view('welcome', $data)`,支援 PHP 原生語法,可選擇性回傳字串。
  • CI4:`view('welcome', $data)` 輔助函數,或控制器回傳 `View` 物件。支援視圖單元、佈局/區塊、內容安全政策 (CSP) nonce 自動注入。
    範例:
<!-- app/Views/layout/main.php -->
<html><head><title></title></head><body>
    renderSection('content') ?>
</body></html>

<!-- app/Views/welcome.php -->
extend('layout/main') ?>
section('content') ?>
<h1>Welcome, !</h1>
endSection() ?>

Controller(控制器)

  • CI3:繼承 CI_Controller,方法對應 URI 片段(`controller/method/param1/param2`)。
  • CI4:繼承 BaseController(再繼承 CodeIgniter\Controller),支援依賴注入、請求/回應物件、過濾器、資源路由(`$routes->resource('photos')` 自動對應 RESTful 方法)。
    範例:
<?php namespace App\Controllers;
use App\Models\UserModel;
use CodeIgniter\HTTP\ResponseInterface;

class Users extends BaseController {
    protected $users;

    public function __construct() {
        $this->users = model(UserModel::class); // 服務定位器快捷方式
    }

    public function index() {
        $data['users'] = $this->users->where('is_active', 1)->findAll();
        return view('users/index', $data);
    }

    public function show($id = null) {
        $user = $this->users->find($id);
        if (!$user) throw new \CodeIgniter\Exceptions\PageNotFoundException();
        return view('users/show', ['user' => $user]);
    }

    public function create() {
        return view('users/create');
    }

    public function store() {
        $rules = ['email' => 'required|valid_email|is_unique[users.email]', 'name' => 'required'];
        if (!$this->validate($rules)) {
            return redirect()->back()->withInput()->with('errors', $this->validator->getErrors());
        }
        $this->users->save([
            'email' => $this->request->getPost('email'),
            'name' => $this->request->getPost('name'),
            'password_hash' => password_hash($this->request->getPost('password'), PASSWORD_DEFAULT),
        ]);
        return redirect()->to('/users')->with('success', 'User created');
    }
}

路由系統:從隱含對應到顯式定義

CI3 預設 `controller/method/params`,CI4 強烈建議在 app/Config/Routes.php 顯式定義:

$routes->get('/', 'Home::index');
$routes->get('users/(:num)', 'Users::show/$1');
$routes->post('users', 'Users::store');
$routes->resource('api/articles', ['controller' => 'Api\Articles']);
$routes->group('admin', ['filter' => 'auth'], static function($routes) {
    $routes->get('dashboard', 'Admin\Dashboard::index');
});

優點:解耦 URI 與類別結構、支援 HTTP 動詞限制、中介軟體掛載、反向路由生成 URL。

服務容器與依賴注入

CI4 採用 Config\Services 註冊單例/共享實例,控制器建構子自動注入:

public function __construct(
    private readonly UserModel $users,
    private readonly \Config\Email $emailConfig
) {}

視圖單元也能注入服務:`render('partials/menu') ?>`。

遷移與種子資料

CI4 內建資料庫遷移(`php spark migrate`)與種子(`php spark db:seed UserSeeder`),版本控管結構變更,團隊協作無縫。

總結

CodeIgniter 以輕量、低耦合、文檔詳盡著稱。CI4 重寫核心,引入現代 PHP 特性(命名空間、型別提示、服務容器、PSR 相容),保留單一入口與 MVC 經典架構,同時提供靈活的路由、強大的模型、安全的視圖層,是中小型專案快速落地的優秀選擇。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved