Пример реализации MVC на php
перейти к списку всех вопросов
Согласно Википедии, Model-view-controller (MVC, «модель-представление-контроллер», «модель-вид-контроллер») — схема использования нескольких шаблонов проектирования, с помощью которых модель приложения, пользовательский интерфейс и взаимодействие с пользователем разделены на три отдельных компонента таким образом, чтобы модификация одного из компонентов оказывала минимальное воздействие на остальные.
Пример реализации MVC на PHP
Структура файлов:
Содержимое файлов
public/index.php
1 2 3 4 5 |
<?php require_once('../app/init.php'); $app=new App; |
app/init.php
1 2 3 4 5 |
<?php require_once('core/App.php'); require_once('core/Controller.php'); |
core/App.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
<?php class App { protected $controller = "home"; protected $method = "index"; protected $params = []; public function __construct() { $url = $this->parseUrl(); if (file_exists('../app/controllers/'.$url[0].'.php')) { $this->controller=$url[0]; unset($url[0]); } require_once('../app/controllers/'.$this->controller.'.php'); $this->controller = new $this->controller; if (isset($url[1])) { if (method_exists($this->controller,$url[1])) { $this->method=$url[1]; unset($url[1]); } } $this->params=$url ? array_values($url) : []; call_user_func_array([$this->controller,$this->method],$this->params); } public function parseUrl() { if (isset($_GET['url'])) { return explode('/',filter_var(rtrim($_GET['url'],'/'),FILTER_SANITIZE_URL)); } return []; } } |
core/Controller.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<?php class Controller { public function model($model) { require_once('../app/models/'.$model.'.php'); return new $model(); } public function view($view,$data=[]) { require_once('../app/views/'.$view.'.php'); } } |
controllers/home.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<?php class Home extends Controller { public function index($name='') { $user=$this->model('User'); $user->name=$name; $this->view('home/index',['name'=>$user->name]); } public function test() { echo 'test method by Home Controller'; } } |
models/User.php
1 2 3 4 5 6 |
<?php class User { public $name; } |
views/home/index.php
1 2 3 |
<?php echo 'name: '.$data['name']; |
public/.htaccess
1 2 3 4 5 6 7 |
Options -MultiViews RewriteEngine On RewriteBase /mvc/public RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.+)$ index.php?url=$1 [QSA,L] |
app/.htaccess
1 2 3 |
Options -Indexes |