下面是详细讲解如何用PHP实现简单的MVC框架实例的攻略:
什么是MVC框架
MVC是一种架构设计模式,即Model-View-Controller。该模式将应用程序分为三个部分:Model(模型)、View(视图)和Controller(控制器)。其中模型负责存储数据和业务逻辑,视图负责展示数据,控制器负责将模型和视图连接起来。MVC框架便是基于MVC模型的一种应用架构。
环境要求
在开始之前,确保你的环境符合以下要求:
- PHP >= 7.0
- Apache服务器或Nginx服务器
实现步骤
1. 创建文件结构
首先,我们需要创建一个目录结构,用来存放我们的框架相关文件。在这里,我们创建以下文件目录和文件:
- app
- controllers
- HomeController.php
- models
- views
- home
- index.php
- core
- App.php
- Controller.php
- Model.php
- Router.php
- public
- index.php
然后,分别创建如下文件:
- HomeController.php
<?php
namespace app\controllers;
class HomeController
{
public function index()
{
echo "Hello, World!";
}
}
- home/index.php
<h1>Welcome to my home page</h1>
- core/Controller.php
<?php
namespace core;
class Controller
{
}
- core/Model.php
<?php
namespace core;
class Model
{
}
- core/App.php
<?php
namespace core;
class App
{
public static function run()
{
$router = new Router();
$router->dispatch();
}
}
- core/Router.php
<?php
namespace core;
class Router
{
public function dispatch()
{
$url = $_SERVER['REQUEST_URI'];
$urlArray = explode('/', $url);
$controllerName = ucfirst($urlArray[1].'Controller');
$actionName = isset($urlArray[2]) ? $urlArray[2] : 'index';
$controllerClass = "app\\controllers\\{$controllerName}";
if(!class_exists($controllerClass)) {
die("Controller {$controllerClass} is not found.");
}
$controller = new $controllerClass;
if(!method_exists($controller, $actionName)) {
die("Method {$actionName} is not found in controller {$controllerClass}.");
}
$controller->$actionName();
}
}
- public/index.php
<?php
require_once '../vendor/autoload.php';
use core\App;
App::run();
在这个目录结构中,我们将会存放“模型”、“控制器”和“视图”等文件。其中,
- app目录存放控制器、模型和视图文件;
- core目录存放框架核心文件;
- public目录存放框架的入口文件。
2. 完成核心框架代码
在上面的目录结构中,我们已经预先建立了App类、Controller类、Model类以及Router类。这些类构成了框架的核心代码,其中:
- App类完成MVC模式的实现:它是整个框架的入口类,并通过Router类实现对控制器的分发。
- Controller类是所有控制器的基类,其中不需要放具体的业务逻辑代码。这个类的主要作用是,抽象出所有控制器共同的行为,并统一处理视图的展示。
- Model类是所有模型的基类。在这里可以定义一些通用的模型方法。
- Router类是分发控制器的类,主要实现Controller和Action的执行。
3. 实现控制器代码
在上面的目录结构中,我们已经在“app/controllers”目录下创建了HomeController.php文件,下面给出Home控制器的实现代码:
<?php
namespace app\controllers;
use core\Controller;
class HomeController extends Controller
{
public function index()
{
$this->render('home/index');
}
}
在这个控制器中,我们定义了一个index方法,用来展示首页。可以发现,HomeController继承了我们定义的Controller基类,并且通过$this->render()方法完成了视图的展示。
4. 实现视图代码
在上面的目录结构中,我们已经在“app/views/home”目录下创建了index.php文件,下面给出Home视图的实现代码:
<h1>Welcome to my home page</h1>
可以看出,这里我们只是简单地展示了一个欢迎页面。
5. 实现框架入口文件
在上面的目录结构中,我们已经在“public”目录下创建了index.php文件,下面给出入口文件的实现代码:
<?php
require_once '../vendor/autoload.php';
use core\App;
App::run();
在这个文件中,我们只是简单地require了autoload.php文件,并调用了App类名称的静态方法run()。
6. 集合在一起
至此,我们已经完成了所有代码的实现,现在我们可以使用它了。将以上所有文件合并,放到本机的网站目录下即可。
7. 测试
在本地的Apache或Nginx服务器上分别运行index.php,可以看到欢迎页面如下:
Welcome to my home page
示例说明
下面给出两个示例说明:
示例一:创建一个控制器和一个视图
我们可以在“app/controllers/”目录中创建一个新的控制器WelcomeController.php,代码如下:
<?php
namespace app\controllers;
use core\Controller;
class WelcomeController extends Controller
{
public function index()
{
$this->render('welcome/index');
}
}
然后在“app/views/welcome”目录中创建一个新的视图index.php,代码如下:
<h1>Welcome to my welcome page</h1>
接着,在“public/index.php”文件中添加如下这行代码:
$router->add('/welcome', 'WelcomeController@index');
这行代码的含义是,在访问“/welcome”时,执行Welcome控制器的index()方法。这时,我们就可以在浏览器中访问“http://localhost/welcome”,可以看到输出了新的视图:
Welcome to my welcome page
示例二:添加路由参数
我们可以在“public/index.php”文件中添加如下这行代码:
$router->add('/welcome/([0-9]+)', 'WelcomeController@index/$1');
这行代码的含义是,在访问“/welcome/数字”时,执行Welcome控制器的index()方法。其中,“数字”会作为参数传递给index()方法。例如,在浏览器中访问“http://localhost/welcome/123”,就会执行Welcome控制器的index()方法,并将参数123传递给该方法。
这时,我们将index()方法修改为:
public function index($id)
{
echo "Welcome to my welcome page, ID is {$id}.";
}
然后重新访问“http://localhost/welcome/123”,可以看到输出:
Welcome to my welcome page, ID is 123.
至此,我们就实现了一个简单的MVC框架实例。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:php实现简单的MVC框架实例 - Python技术站