Що таке MVC чи з чого почати писати сайт?

Не судіть суворо, щоб показати приклад роботи MVC, я за 20 хвилин накидав простий код, побудований на поділі шляху в засланні. Розбиратимемо все на прикладі локального посилання:

http://test1.loc/product/test-product

Наша структура проекту складатиметься з 4 папок та декількох php файлів.

Структура папок проекту

1. .htaccess:

Це перший файл, який спрацьовує при входженні користувача, ще на рівні apache.

AddDefaultCharset UTF-8
Options +FollowSymLinks
RewriteEngine on

RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php?path=$1&%{QUERY_STRING}  [L]

В опочі обов'язково має бути встановлений mod_rewrite.

RewriteRule ^index\.php$ - [L] // - говорить про те, що головний файл запуску index.php. В урлі його не обов'язково тепер вказувати.

RewriteRule ^(.*)$ /index.php?path=$1&%{QUERY_STRING}  [L] // - весь шлях (product/test-product) заходить у $_GET параметр, який ми потім будемо розділяти на роути.

2. index.php:

Є запускним файлом, у якому я розмістив керування помилками та запуск наступного етапу.

<?php

if (strpos($_SERVER['REQUEST_URI'], '.php') !== false) {
    header("Location:http://" . $_SERVER['SERVER_NAME']);
    exit;
}

define('ENVIRONMENT', 'development');

switch (ENVIRONMENT) {
    case 'development':
        error_reporting(E_ALL ^ ​​E_NOTICE ^ E_WARNING);
        ini_set('display_errors', 'on');
        break;

    case 'testing':
    case 'production':
        error_reporting(E_ALL ^ ​​E_NOTICE ^ E_DEPRECATED ^ E_STRICT ^ E_WARNING);
        ini_set('display_errors', 'off');
        break;

    default:
        header('HTTP/1.1 503 Service Unavailable.', TRUE, 503);
        exit('The application environment is not set correctly.');
}

define('DOCUMENT_ROOT', $_SERVER['DOCUMENT_ROOT']);
define('SERVER_NAME ', $_SERVER['SERVER_NAME']);

require_once DOCUMENT_ROOT.'/system/router.php';
new Router();

Тут ми оголошуємо константи та запускаємо клас Router();

3. system/router.php:

Головний роутер, який ділить посилання на сегменти масиву, та запускає контролер за назвою першого сегмента посилання. Перший сегмент посилання product. Тому підвантажуватиметься product.php

<?php

if (!defined('DOCUMENT_ROOT')) {
    exit('No direct script access allowed');
}    

class Router {
    
    private $full_path ='';
    private $array_path = array();
       
    public function __construct() {
        $this->parse_path();
    }
    
    private function parse_path() {
        $this->full_path = $_GET['path'];
        $this->array_path = explode('/', $_GET['path']);
        unset($_GET['path']);
        
        if (file_exists(DOCUMENT_ROOT . '/controller/'.$this->array_path[0] . '.php')) {
          ;   require_once DOCUMENT_ROOT . '/controller/'. $this->array_path[0] . '.php';
            
            if (class_exists($this->array_path[0])) {
            &nbsp  $class = new $this->array_path[0]($this->array_path);
                 $class->index();
            }
        }
    }
    
}

!defined('DOCUMENT_ROOT') - не дасть запустити php файл на виконання безпосередньо.

parse_path() - ми розділяємо урл $_GET['path'], який надходить з htaccess, на шлях до файлів і запускається index().

4. controller/product.php:

Обробник Controller. У ньому розміщуватимемо логіку обробки моделі та view. Перший сегмент посилання product. Тому підвантажується цей файл. Далі, я думаю, зрозуміло, чому підвантажується "product_model.php" та "product_view.php"

<?php

if (!defined('DOCUMENT_ROOT')) {
    exit('No direct script access allowed');
}

/**
 * Контролер обробки розрахунків та логіки
 */
class product {

    private $array_path = array();

    public function __construct($path) {
        $this->array_path = $path;
    }

    public function index() {
        $dataProduct = $this->connectPhp('model');    
        
        $this->includeFile('view', ['dataProduct' => $dataProduct]);
        
    }

    private function connectPhp($folder) {

        if ($this->includeFile($folder)) {

            if (class_exists($this->array_path[0] . '_' . $folder)) {
            ;    $name = $this->array_path[0] . '_'. $folder;
                $class = new $name($this->array_path);
               return $class->index();
            }
        }
    }

    private function includeFile($folder, $data = false) {
        if (file_exists(DOCUMENT_ROOT . '/' . $folder . '/' . $this->array_path[0]. '_' . $folder . '.php')) {

&nbsp ;           include DOCUMENT_ROOT . '/'. $ folder . '/'. $this->array_path[0]. '_'. $ folder . '.php';
            return TRUE;
            
        }
        return FALSE;
        
    }

}

в index() підключаємо модель і підключається view, в якій використовуємо отриману змінну $dataProduct.

5. model/product_model.php:

Ця модель відповідатиме за обробку запитів до бази. У ній будемо розміщувати все, що стосується коннектів та запитів.

<?php

if (!defined('DOCUMENT_ROOT')) {
    exit('No direct script access allowed');
}

/**
 * Модель для маніпуляцій із запитами в базу
 */< br />class product_model {   
    
    private $array_path = array();
    
    public function __construct($path) {
        $this->array_path = $path;
    }
    
    public function index() {
        $this->dbConnect();
        
        return $this->getProduct();
    }
    
    private function dbConnect() {
        // Тут проходить коннект до бази
    }
    
    private function getProduct () {
        // Дістаємо щось, що стосується товару $this->array_path[1];
        return 'Товар тест тест';
    }
    
}

Модель порожня, не заповнював її, просто повернув рядок для прикладу структури MVC. Тут також запускається index() і повертає рядок.

6.view/product_view.php:

HTML виведення сторінки. Формується сама view, яка буде доступна користувачеві.

<html>
    <head>
        <title>Головна сторінка - сторінка про мене</title>
    </head>
    <body>
    <center><h1><?php echo $data['dataProduct']; ?></h1></center>
    <center><h2>Опис товару</h2></center>
</body>
</html>

Передаємо рядок, який прийшов з моделі в масиві $data. Виводимо і все круто.

Зрештою у нас вийде звичайна сторінка.

Підсумковий висновок view

Не судіть суворо, адже я не ставив завдання показати правильний код чи правильну структуру класів. Знайшло натхнення пояснити MVC.

2911 2

Відгуки

Добрый день, Файзулла.
В общем view/product_view.php это и есть подключаемая фронтовая страница.
Для каждого контроллера можно создать свой фронтовый php файл. Можно поиграться с расширением структуры на namespace.
Я привел только стркутурный пример, чтобы показать что такое MVC. Так же есть еще HMVC, но не будем углубляться)
В любом случае тема эта большая и должна исходить из задачи, которую желают видеть в проекте)
Можно разобрать какай-то индивидуальный пример для Вас, отпишите через обратную связь если есть желание)
Здравствуйте.
Немного ясно стало, но не совсем... в частности как соединять фронтенд с бакэндом
я хочу сайт сделать на РНР без шаблонизатора и фрэймворка, но в MVC/
Поможете? и вам материал на сайт будет )))
Тільки авторизовані користувачі можуть залишати відгуки Вхід

Схожі статті

Створити та завантажити CSV на PHP

Розглянемо можливість швидкого створення CSV файлу з автоматичним скачуванням файлу. Розглянемо формування, роздільники та header для можливості завантажити файл.

Шаблони ImageCMS 4.10-4.12.1

Останні шаблони від ImageCMS 4.12, для завантаження потрібна авторизація.