So implementieren Sie MVC in PHP

藏色散人
Freigeben: 2023-03-07 21:36:01
Original
3374 Leute haben es durchsucht

So implementiert PHP MVC: Vereinbaren Sie beim Anfordern der Seite zunächst die Verzeichnisstruktur. Erstellen Sie dann den Controller-Controller und bestimmen Sie schließlich die zu verwendende Ansicht Modellmodell, und ändern Sie einfach die Eintragsdatei.

So implementieren Sie MVC in PHP

Empfohlen: „PHP-Video-Tutorial

Die Betriebsumgebung dieses Tutorials: Windows 7-System, PHP-Version 7.1. Diese Methode ist für alle Computermarken geeignet.

php implementiert mvc

Die Verwendung von MVC in PHP wird immer beliebter, insbesondere in einigen Open-Source-Frameworks. MVC reicht für die meisten Situationen aus, es gibt jedoch Situationen, in denen es nicht geeignet ist, z. B. bei relativ einfachen persönlichen Blogs. Bei Blogs mit nur wenigen hundert Artikeln fühlt sich die Verwendung von MVC etwas zu kompliziert an Artikel: MVC ist für die meisten Situationen nicht geeignet. Bei Portal-Websites wie Sina wird bei Verwendung von MVC eine große Anzahl von Dateien geladen, und die Auswirkungen auf die Geschwindigkeit sind nicht akzeptabel. Maple Bamboo Dream stellt die Grundprinzipien von MVC und eine einfache Implementierung vor. Die folgende Einführung ist für die PHP-Entwicklung geeignet.

MVC in PHP

MVC[1] ist eine Softwarearchitektur in der Softwareentwicklung. Aus PHP-Sicht ist MVC etwas anders.

Modell (Modell), die Implementierung von Programmanwendungsfunktionen und die Implementierung von Programmlogik. Verantwortlich für Datenmanagement und Datengenerierung in PHP.

Ansicht (Ansicht), grafische Schnittstellenlogik. Verantwortlich für die Ausgabe in PHP, Umgang mit dem Aufruf von Vorlagen und erforderlichen Ressourcendateien.

Controller (Controller) ist für die Weiterleitung von Anfragen und die Bearbeitung von Anfragen zuständig. In PHP wird anhand der Anfrage ermittelt, welcher View aufgerufen werden soll und welche Daten verwendet werden.

Warum MVC verwenden?

Die Hauptfunktion von MVC besteht darin, Code zu schichten und zu klassifizieren.

Der Hauptzweck von MVC besteht darin, das Problem der Trennung von Entwicklungs- und Designarbeit in der Webentwicklung zu lösen und die Arbeit relativ unabhängig zu machen.

Dabei haben wir auch einige weitere Vorteile entdeckt: Die Verzeichnisstruktur der Website ist übersichtlicher, die Website ist einfacher zu warten und zu erweitern und Module können wiederverwendet werden. MVC-Implementierung kann es basierend auf dieser URL-Strukturoptimierung optimieren. Es hat für diesen Artikel wenig Relevanz und wird später geteilt.

Wie aus den obigen Parametern ersichtlich ist, ist die Datei, auf die zugegriffen wird, index.php, die auch 3 Parameter enthält: c, a, param.

MVC-Verzeichnisstruktur

Als nächstes planen Sie die Verzeichnisstruktur von MVC wie folgt:

localhost/index.php?c=demo&a=index&param=welcome
Nach dem Login kopieren

controller

Fügen Sie den folgenden Code zur Datei controller/democontroller.php hinzu .

/*
├─www                       # 网站根目录
│  ├─controller             # 控制器目录
│  │  ├─democontroller.php  # demo控制器
│  ├─model                  # 模型目录
│  │  ├─model.php           # model模型
│  ├─view                   # 视图目录
│  │  ├─index.php           # index视图
│  ├─index.php              # 入口文件
*/
Nach dem Login kopieren

In dieser Datei ist nur einer definiertDemoController, und es enthält nur eineindexMethode für die AusgabeHallo Welt.

Fügen Sie den folgenden Code zur Eintragsdatei index.php hinzu. index.php,同时含有3个参数分别为caparam

MVC目录结构

接着,规划MVC的目录结构如下:

// controller/democontroller.php
class DemoController
{
    public function index()
    {
        echo 'hello world';
    }
}// End of the class DemoController

// End of file democontroller.php
Nach dem Login kopieren

控制器controller

将如下代码添加到controller/democontroller.php文件中。

1 //index.php
2 require('controller/democontroller.php');
3 $controller = new DemoController();
4 $controller->index();
5 
6 // End of index.php
Nach dem Login kopieren

在这个文件中仅仅定义了一个DemoController的类,且其只包含一个index方法,用于输出hello world

将下面代码添加到入口文件index.php文件中。

localhost/index.php?c=abc
Nach dem Login kopieren

在浏览器中使用上面的约定的URL进行访问,看到输出hello world。当然如果你请求的URL不是那样,而是如下面所示也能得到同样的输出。

localhost/controller/democontroller.php
Nach dem Login kopieren

发现URL中的参数还没有任何作用。

如果使用下面的URL进行访问,可以预见不会有任何输出。

//index.php
// get runtime controller prefix
$c_str = $_GET['c'];
// the full name of controller
$c_name = $c_str.'controller';
// the path of controller
$c_path = 'controller/'.$c_name.'.php';
// get runtime action
$method = $_GET['a'];
// load controller file
require($c_path);
// instantiate controller
$controller = new $c_name;
// run the controller  method
$controller->$method();

// End of index.php
Nach dem Login kopieren

可以看到要想访问这个网站并得到正确的结果,目前只能通过index.php来访问,这也是为什么称它为入口文件的原因。现在无论参数如何只能访问同样一个页面,那么如何来决定显示不同的结果呢?或者调用不同的控制器呢?

改进入口文件

下面利用URL中的参数来决定使用哪个控制器。

// view/index.php
class Index {
    public function display($output) {
        // ob_start();
        echo $output;
    }
}

// End of index.php
Nach dem Login kopieren

同样在浏览器中使用上面的约定的URL进行访问,看到输出hello world。代码中的注释已经说明了每一步的目的。当然可以通过改变URL参数中的ca值来调用不同的controller及其方法,以输出不同的结果。

视图View

前面只是使用了控制器controller,同时在入口文件index.php中实现了动态调用不同的控制器。接着加入视图将显示分离。

// controller/democontroller.php
class DemoController
{
    private $data = 'Hello furzoom!';
    public function index()
    {
        //echo 'hello world';
        require('view/index.php');
        $view = new Index();
        $view->display($data);
    }
}// End of the class DemoController

// End of file democontroller.php
Nach dem Login kopieren

视图目录中的index.php文件中定义了Index方法,且只有一个display()函数,负责将传递给它的变量进行输出。

下面修改控制器文件。

Hello furzoom!
Nach dem Login kopieren
Nach dem Login kopieren

在控制器中定义了一个data

// model/model.php
class Model {
    private $data = array(
                'title' => 'Hello furzoom',
                'welcome' => 'Welcome to furzoom.com',
                );

    public function getData($key) {
        return $this->data[$key];
    }
}

// End of model.php
Nach dem Login kopieren
Nach dem Login kopieren

Verwenden Sie die oben vereinbarte URL im Browser, um auf die Ausgabe hello world zuzugreifen und diese anzuzeigen. Wenn die von Ihnen angeforderte URL natürlich nicht dieser URL entspricht, können Sie, wie unten gezeigt, die gleiche Ausgabe erhalten.
🎜
//index.php
// get runtime controller prefix
$c_str = $_GET['c'];
// the full name of controller
$c_name = $c_str.'controller';
// the path of controller
$c_path = 'controller/'.$c_name.'.php';
// get runtime action
$method = $_GET['a'];
// get runtime parameter
$param = $_GET['param'];
// load controller file
require($c_path);
// instantiate controller
$controller = new $c_name;
// run the controller  method
$controller->$method($param);

// End of index.php
Nach dem Login kopieren
Nach dem Login kopieren
🎜 hat festgestellt, dass die Parameter in der URL keine Auswirkung haben. 🎜🎜Wenn Sie die unten stehende URL verwenden, um darauf zuzugreifen, können Sie damit rechnen, dass keine Ausgabe erfolgt. 🎜
// controller/democontroller.php
class DemoController
{
    // private $data = 'Hello furzoom!';
    function index($param)
    {
        // echo 'hello world';
        require('view/index.php');
        require('model/model.php');
        $model = new Model();
        $view = new Index();
        $data = $model->getData($param);
        $view->display($data);
    }
}// End of the class DemoController

// End of file democontroller.php
Nach dem Login kopieren
Nach dem Login kopieren
🎜Sie sehen, wenn Sie auf diese Website zugreifen und die richtigen Ergebnisse erhalten möchten, können Sie derzeit nur über index.php darauf zugreifen, weshalb sie als Eintragsdatei bezeichnet wird. Jetzt können Sie unabhängig von den Parametern nur auf dieselbe Seite zugreifen. Wie entscheiden Sie sich also für die Anzeige unterschiedlicher Ergebnisse? Oder wie wäre es mit einem anderen Controller? 🎜

Verbessern Sie die Eintragsdatei

🎜Im Folgenden werden die Parameter in der URL verwendet, um zu entscheiden, welcher Controller verwendet werden soll. 🎜
Welcome to furzoom.com
Nach dem Login kopieren
Nach dem Login kopieren
🎜Verwenden Sie in ähnlicher Weise die oben vereinbarte URL, um im Browser darauf zuzugreifen und die Ausgabe hello world anzuzeigen. Kommentare im Code erläutern den Zweck jedes Schritts. Natürlich können Sie verschiedene Controller und ihre Methoden aufrufen, indem Sie die Werte c und a in den URL-Parametern ändern, um unterschiedliche Ergebnisse auszugeben. 🎜

Ansicht

🎜Wir haben zuvor nur den Controller-Controller verwendet und verschiedene Controller in der Eintragsdatei index.php dynamisch aufgerufen. Wenn Sie dann die Ansicht verbinden, wird die Trennung angezeigt. 🎜rrreee🎜Die Methode Index ist in der Datei index.php im Ansichtsverzeichnis definiert und es gibt nur eine Funktion display(), die für die Ausgabe der Variablen verantwortlich ist darauf übergegangen. 🎜🎜Ändern Sie die Controller-Datei unten. 🎜rrreee

definiert eine private data-Variable im Controller. Die index()-Methode gibt nicht mehr direkt aus, sondern verwendet das Ansichtsobjekt, um die Ausgabe zu verarbeiten . An dieser Stelle sehen Sie beim Zugriff über die oben vereinbarte URL die Ausgabe: 🎜

Hello furzoom!
Nach dem Login kopieren
Nach dem Login kopieren

可以根据不同的请求调用不同的视图类,以不同的形式显示数据。这样就将增加了视图的作用,设计人员可以只针对视图进行页面的设计。

模型Model

上面貌似已经很cool了,但是显示什么样的内容是在控制器中直接指定的,希望内容也由URL指定,这样将数据的处理交给模型来处理。

// model/model.php
class Model {
    private $data = array(
                'title' => 'Hello furzoom',
                'welcome' => 'Welcome to furzoom.com',
                );

    public function getData($key) {
        return $this->data[$key];
    }
}

// End of model.php
Nach dem Login kopieren
Nach dem Login kopieren

视图文件model.php定义了一个Model类,类中定义了一个getData()的方法,用于返回请求的数据。

同时修改入口文件index.php如下:

//index.php
// get runtime controller prefix
$c_str = $_GET['c'];
// the full name of controller
$c_name = $c_str.'controller';
// the path of controller
$c_path = 'controller/'.$c_name.'.php';
// get runtime action
$method = $_GET['a'];
// get runtime parameter
$param = $_GET['param'];
// load controller file
require($c_path);
// instantiate controller
$controller = new $c_name;
// run the controller  method
$controller->$method($param);

// End of index.php
Nach dem Login kopieren
Nach dem Login kopieren

增加了一个参数$param,将其作为控制器的方法调用参数。

还需要修改控制器的方法根据不同参数取得不同的数据。

// controller/democontroller.php
class DemoController
{
    // private $data = 'Hello furzoom!';
    function index($param)
    {
        // echo 'hello world';
        require('view/index.php');
        require('model/model.php');
        $model = new Model();
        $view = new Index();
        $data = $model->getData($param);
        $view->display($data);
    }
}// End of the class DemoController

// End of file democontroller.php
Nach dem Login kopieren
Nach dem Login kopieren

包含需要的视图文件和模型文件,然后生成视图与模型文件,接着通过模型对象取得数据,再用视图对象来输出取得的数据。

此时,在浏览器中使用上面的约定的URL进行访问,将得到输出如下:

Welcome to furzoom.com
Nach dem Login kopieren
Nach dem Login kopieren

至此PHP的MVC模式已经基本介绍完成了,剩余的工作就是根据需要进行添加扩充了,很简单吧!!

Das obige ist der detaillierte Inhalt vonSo implementieren Sie MVC in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage