Maison développement back-end tutoriel php php开发一个简单的MVC

php开发一个简单的MVC

Jul 25, 2016 am 09:11 AM

本文通过实例为大家介绍用php开发一个简单mvc的方法,起到势砖引玉的作用,本文比较适合刚接触mvc的朋友。 MVC其实就是三个Model,Contraller,View单词的简称。 Model,主要任务就是把数据库或者其他文件系统的数据按 照我们需要的方式读取出来。 View,主要负责页面的,把数据以html的形式显示给用户。 Controller,主要负责业务逻辑,根据用户的 Request进行请求的分配,比如说显示登陆界面,就需要调用一个控制器userController的方法loginAction来显示。

本文为大家介绍如何用PHP来创建一个简单的MVC结构系统。

首先创建单点入口,即bootstrap文件index.php,作为整个MVC系统的唯一入口。 什么是单点入口呢?所谓单点入口就是整个应用程序只有一 个入口,所有的实现都通过这个入口来转发。为什么要做到单点入口呢? 单点入口有几大好处: 第一、一些系统全局处理的变量,类,方法都可以在这里进行处理。 比如说你要对数据进行初步的过滤,你要模拟session处理,你要定义一些全局变量,甚至你要注册一些对象或者变量到注册器里面。 第二、程序的架构更加 清晰明了。

  1. include("core/ini.php");
  2. initializer::initialize();
  3. $router = loader::load("router");
  4. dispatcher::dispatch($router);
复制代码

这个文件就只有4句,我们现在一句句来分析。 include(”core/ini.php”);

我们来看core/ini.php

  1. set_include_path(get_include_path() . PATH_SEPARATOR . "core/main");
  2. //set_include_path — Sets the include_path configuration option
  3. function __autoload($object){
  4. require_once("{$object}.php");
  5. }
复制代码

这个文件首先设置了include_path,也就是我们如果要找包含的文件,告诉系统在这个目录下查找。其实我们定义__autoload()方法,这个方法是在PHP5增加的,就是当我们实例化一个函数的时候,如果本文件没有,就会自动去加载文件。官方的解释是: Many developers writing object-oriented applications create one PHP source file per-class definition. One of the biggest annoyances is having to write a long list of needed includes at the beginning of each script (one for each class).

In PHP 5, this is no longer necessary. You may define an __autoload function which is automatically called in case you are trying to use a class/interface which hasn’t been defined yet. By calling this function the scripting engine is given a last chance to load the class before PHP fails with an error.

接下来我们看下面一句 initializer::initialize(); 这就话就是调用initializer类的一个静态函数initialize,因为我们在ini.php,设置了include_path,以及定义了__autoload,所以程序会自动在core/main目录查找initializer.php. initializer.php文件如下:

  1. class initializer
  2. {
  3. public static function initialize() {
  4. set_include_path(get_include_path().PATH_SEPARATOR . "core/main");
  5. set_include_path(get_include_path().PATH_SEPARATOR . "core/main/cache");
  6. set_include_path(get_include_path().PATH_SEPARATOR . "core/helpers");
  7. set_include_path(get_include_path().PATH_SEPARATOR . "core/libraries");
  8. set_include_path(get_include_path().PATH_SEPARATOR . "app/controllers");
  9. set_include_path(get_include_path().PATH_SEPARATOR."app/models");
  10. set_include_path(get_include_path().PATH_SEPARATOR."app/views");
  11. //include_once("core/config/config.php");
  12. }
  13. }
  14. ?>
复制代码

这个函数很简单,就只定义了一个静态函数,initialize函数,这个函数就是设置include_path,这样,以后如果包含文件,或者__autoload,就会去这些目录下查找。

OK,我们继续,看第三句 $router = loader::load(”router”);

这句话也很简单,就是加载loader函数的静态函数load,下面我们来loader.php

  1. class loader
  2. {
  3. private static $loaded = array();
  4. public static function load($object){
  5. $valid = array( "library",
  6. "view",
  7. "model",
  8. "helper",
  9. "router",
  10. "config",
  11. "hook",
  12. "cache",
  13. "db");
  14. if (!in_array($object,$valid)){
  15. throw new Exception("Not a valid object '{$object}' to load");
  16. }
  17. if (empty(self::$loaded[$object])){
  18. self::$loaded[$object]= new $object();
  19. }
  20. return self::$loaded[$object];
  21. }
  22. }
复制代码

这个文件就是去加载对象,因为以后我们可能会丰富这个MVC系统,会有model,helper,config等等的组件。如果加载的组件不在有效 的范围内,我们抛出一个异常。如果在的话,我们实例化一个对象,其实这里用了单件设计模式。也就是这个对象其实就只能是一个实例化对象,如果没有实例化, 创建一个,如果存在的,则不实例化。

好,因为我们现在要加载的是router组件,所以我们看下router.php文件,这个文件的作用就是映射URL,对URL进行解析。 router.php

  1. class router
  2. {
  3. private $route;
  4. private $controller;
  5. private $action;
  6. private $params;
  7. public function __construct()
  8. {
  9. $path = array_keys($_GET);
  10. if (!isset($path[0])){
  11. if (!empty($default_controller))
  12. $path[0] = $default_controller;
  13. else
  14. $path[0] = "index";
  15. }
  16. $route= $path[0];
  17. $this->route = $route;
  18. $routeParts = split( "/",$route);
  19. $this->controller=$routeParts[0];
  20. $this->action=isset($routeParts[1])? $routeParts[1]:"base";
  21. array_shift($routeParts);
  22. array_shift($routeParts);
  23. $this->params=$routeParts;
  24. }
  25. public function getAction() {
  26. if (empty($this->action)) $this->action="main";
  27. return $this->action;
  28. }
  29. public function getController() {
  30. return $this->controller;
  31. }
  32. public function getParams() {
  33. return $this->params;
  34. }
  35. }
复制代码

我们可以看到,首先我们是拿到$_GET,用户Request的URL,然后从URL里我们解析出Controller和Action,以及Params 比如我们的地址是http://www.tinoweb.cn/user/profile/id/3 那么从上面的地址,我们可以拿到controller是user,action似乎profile,参数是id以及3

OK我们看最后一句,就是 dispatcher::dispatch($router);

这句话的意思很明了,就是拿到URL解析的结果,然后通过dispatcher来分发controlloer及action来Response给用户 好,我们来看下dispatcher.php文件

  1. class dispatcher
  2. {
  3. public static function dispatch($router)
  4. {
  5. global $app;
  6. ob_start();
  7. $start = microtime(true);
  8. $controller = $router->getController();
  9. $action = $router->getAction();
  10. $params = $router->getParams();
  11. $controllerfile = "app/controllers/{$controller}.php";
  12. if (file_exists($controllerfile)){
  13. require_once($controllerfile);
  14. $app = new $controller();
  15. $app->setParams($params);
  16. $app->$action();
  17. if (isset($start)) echo "
  18. Tota1l time for dispatching is : ".(microtime(true)-$start)." seconds.";

  19. $output = ob_get_clean();
  20. echo $output;
  21. }else{
  22. throw new Exception("Controller not found");
  23. }
  24. }
  25. }
复制代码

这个类很明显,就是拿到$router来,寻找文件中的controller和action来回应用户的请求。 OK,我们一个简单的,MVC结构,就这样,当然这里还不能算是一个很完整的MVC,因为这里还没有涉及到View和Model,有空我再这里丰富。 我们来写个Controller文件来测试下上面的这个系统。 我们在app/controllers/下创建一个user.php文件 //user.php

  1. class user
  2. {
  3. function base()
  4. {
  5. }
  6. public function login()
  7. {
  8. echo 'login html page';
  9. }
  10. public function register()
  11. {
  12. echo 'register html page';
  13. }
  14. public function setParams($params){
  15. var_dump($params);
  16. }
  17. }
复制代码

然后,可以在浏览器中输入http://localhost/index.php?user/register 或 http://localhost/index.php?user/login来测试下。



Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Comment déverrouiller tout dans Myrise
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Travailler avec les données de session Flash dans Laravel Travailler avec les données de session Flash dans Laravel Mar 12, 2025 pm 05:08 PM

Laravel simplifie la gestion des données de session temporaires à l'aide de ses méthodes de flash intuitives. Ceci est parfait pour afficher de brefs messages, alertes ou notifications dans votre application. Les données ne persistent que pour la demande ultérieure par défaut: $ demande-

Curl dans PHP: Comment utiliser l'extension PHP Curl dans les API REST Curl dans PHP: Comment utiliser l'extension PHP Curl dans les API REST Mar 14, 2025 am 11:42 AM

L'extension PHP Client URL (CURL) est un outil puissant pour les développeurs, permettant une interaction transparente avec des serveurs distants et des API REST. En tirant parti de Libcurl, une bibliothèque de transfert de fichiers multi-protocol très respectée, PHP Curl facilite Efficient Execu

Misque de réponse HTTP simplifié dans les tests Laravel Misque de réponse HTTP simplifié dans les tests Laravel Mar 12, 2025 pm 05:09 PM

Laravel fournit une syntaxe de simulation de réponse HTTP concise, simplifiant les tests d'interaction HTTP. Cette approche réduit considérablement la redondance du code tout en rendant votre simulation de test plus intuitive. L'implémentation de base fournit une variété de raccourcis de type de réponse: Utiliser illuminate \ support \ faades \ http; Http :: faux ([[ 'google.com' => 'Hello World', 'github.com' => ['foo' => 'bar'], 'forge.laravel.com' =>

12 meilleurs scripts de chat PHP sur Codecanyon 12 meilleurs scripts de chat PHP sur Codecanyon Mar 13, 2025 pm 12:08 PM

Voulez-vous fournir des solutions instantanées en temps réel aux problèmes les plus pressants de vos clients? Le chat en direct vous permet d'avoir des conversations en temps réel avec les clients et de résoudre leurs problèmes instantanément. Il vous permet de fournir un service plus rapide à votre personnalité

Expliquez le concept de liaison statique tardive en PHP. Expliquez le concept de liaison statique tardive en PHP. Mar 21, 2025 pm 01:33 PM

L'article traite de la liaison statique tardive (LSB) dans PHP, introduite dans PHP 5.3, permettant une résolution d'exécution de la méthode statique nécessite un héritage plus flexible. Problème main: LSB vs polymorphisme traditionnel; Applications pratiques de LSB et perfo potentiel

Caractéristiques de sécurité du cadre: protection contre les vulnérabilités. Caractéristiques de sécurité du cadre: protection contre les vulnérabilités. Mar 28, 2025 pm 05:11 PM

L'article traite des fonctionnalités de sécurité essentielles dans les cadres pour se protéger contre les vulnérabilités, notamment la validation des entrées, l'authentification et les mises à jour régulières.

Frameworks de personnalisation / d'extension: comment ajouter des fonctionnalités personnalisées. Frameworks de personnalisation / d'extension: comment ajouter des fonctionnalités personnalisées. Mar 28, 2025 pm 05:12 PM

L'article examine l'ajout de fonctionnalités personnalisées aux cadres, en se concentrant sur la compréhension de l'architecture, l'identification des points d'extension et les meilleures pratiques pour l'intégration et le débogage.

See all articles