构建您的第一个 PHP MVC 框架

admin 2023-11-14 298 阅读 0评论

MVC 是软件开发中常用的一种设计模式,尤其是 Web 应用程序开发中。它将应用程序分为三个互连的组件:模型、视图和控制器。这种分层结构可以提高模块化性、可维护性和易于开发性。

  • 模型 (M)代表应用程序的数据和业务逻辑。这意味着它负责检索、操作和存储数据。

  • 视图(V)充当表示层,负责将数据呈现给最终用户。

  • 控制器(C)是模型和视图之间的中介。它接收用户输入并确定要调用哪个或哪些模型以及要呈现哪个视图。

MVC 模式通过将应用程序分为三个互相独立的组件,来强制关注点分离。这种分离使得应用程序更加易于理解、维护和扩展。

先决条件

在本教程中,您将学习如何从头开始构建简单的 PHP MVC 框架。为了继续进行,您应该对以下内容有基本的了解:

PHP OOP 概念

  • Composer — PHP 包管理器
  • HTML/CSS - 框架不需要,但构建之后的页面需要

设置项目

要创建一个新的 Composer 项目,请执行以下步骤:

  • 创建一个新目录并将其命名为您的项目名称。
  • 在您的编辑器中打开该目录。
  • 在终端中运行 composer init 命令。
composer init

在 composer init 过程中,您可以按 Enter 键跳过除开发依赖项之外的所有问题。当系统要求您添加依赖项时,请暂时键入“no”。

为简单起见,我们将命名空间更改为更短的名称,例如 App. 为此,请更改composer.json文件中“psr-4”的密钥:

"Maheshsamudra\\SimplePhpMvcStarter\\" -> "App\\"

然后,运行composer dump-autoload它将更新项目中必须包含的类。

目录结构

public/ # 此处作为域的指向目标
src/
   Controllers/
   Models/
   Routes/
   Views/
vendor/ # 由composer自动创建

构建核心组件

设置公用文件夹

在 public/ 目录中创建名为 index.php 的新文件。该文件将作为应用程序的入口点。

<?php 

require  '../vendor/autoload.php' ; 

$router = require  '../src/Routes/index.php' ;

处理路线

在 src/ 目录中创建 Router.php 文件。该文件将负责将路由映射到正确的控制器。

<?php

namespace App;

class Router
{
    protected $routes = [];

    private function addRoute($route$controller$action$method)
    {

        $this->routes[$method][$route] = ['controller' => $controller'action' => $action];
    }

    public function get($route$controller$action)
    {
        $this->addRoute($route$controller$action"GET");
    }

    public function post($route$controller$action)
    {
        $this->addRoute($route$controller$action"POST");
    }

    public function dispatch()
    {
        $uri = strtok($_SERVER['REQUEST_URI'], '?');
        $method =  $_SERVER['REQUEST_METHOD'];

        if (array_key_exists($uri$this->routes[$method])) {
            $controller = $this->routes[$method][$uri]['controller'];
            $action = $this->routes[$method][$uri]['action'];

            $controller = new $controller();
            $controller->$action();
        } else {
            throw new \Exception("No route found for URI: $uri");
        }
    }
}

现在,要设置初始路由,请在 src/ 目录中创建 Routes.php 文件。您可以在此文件中映射 POST 和 GET请求的路由。

<?php

use App\Controllers\HomeController;
use App\Router;

$router = new Router();

$router->get('/', HomeController::class, 'index');

$router->dispatch();

控制器 - 处理主页

首先,在 src/ 目录中创建 Controller.php 文件夹。

<?php

namespace App;

class Controller
{
    protected function render($view$data = [])
    {
        extract($data);

        include "Views/$view.php";
    }
}

现在,我们需要创建一个 HomeController 来处理请求。在 src/Controllers/ 目录中创建 HomeController.php 文件,并在其中添加一个 index() 方法来处理主页。

<?php

namespace App\Controllers;

use App\Controller;

class HomeController extends Controller
{
    public function index()
    {

        $this->render('index');
    }
}

添加视图

最后,要提供主页,请在 src/Views/ 目录中创建 index.php 文件。

<h1>Welcome to Simple PHP MVC Starter!</h1>

测试进度

现在,该应用程序已准备好提供主页服务。在公用文件夹中运行内置 PHP Web 服务器即可测试。

cd simple-php-mvc-starter 

php -S localhost:9999

如果一切正常,您应该在浏览器中看到以下内容:

创建模型

在 Models/ 目录中创建一个名为 Journals.php 的新文件。该文件代表应用程序中的期刊。

<?php

namespace App\Models;

class Journal
{
    public $name;
    public $publishedYear;

    public function __construct($name$publishedYear)
    {
        $this->name = $name;
        $this->publishedYear = $publishedYear;
    }
}

现在,让我们向主页添加一些期刊。更新HomeController.php以加载日志。

<?php

namespace App\Models;

class Journal
{
    public $name;
    public $publishedYear;

    public function __construct($name$publishedYear)
    {
        $this->name = $name;
        $this->publishedYear = $publishedYear;
    }
}

最后,更新 Views/ 目录中的 index.php 文件。

<h1>Welcome to Simple PHP MVC Starter!</h1>

<ul>
    <?php foreach ($journals as $journal) : ?>
        <li><?= $journal->name ?> (<?= $journal->publishedYear ?>)</li>
    <?php endforeach; ?>
</ul>

就是这样。您已经成功构建了您的第一个 PHP MVC 框架。

虽然这是一个简单的开始,但从头开始创建 PHP MVC 框架是一项具有挑战性的任务,需要大量的时间和精力。拥有这样的项目经验将为你的简历增色不少。

发表评论

快捷回复: 表情:
Addoil Applause Badlaugh Bomb Coffee Fabulous Facepalm Feces Frown Heyha Insidious KeepFighting NoProb PigHead Shocked Sinistersmile Slap Social Sweat Tolaugh Watermelon Witty Wow Yeah Yellowdog
提交
评论列表 (有 0 条评论, 298人围观)

最近发表

热门文章

最新留言

热门推荐

标签列表