Що таке MVC чи з чого почати писати сайт? / ~#root -i Що таке MVC чи з чого почати писати сайт? / ~#root -i Що таке MVC чи з чого почати писати сайт? / ~#root -i Що таке MVC чи з чого почати писати сайт? / ~#root -i Що таке MVC чи з чого почати писати сайт? / ~#root -i Що таке MVC чи з чого почати писати сайт? / ~#root -i Що таке MVC чи з чого почати писати сайт? / ~#root -i Що таке MVC чи з чого почати писати сайт? / ~#root -i
  • RU
  • UA
  • EN
  • Створити інтернет-магазин
  • Документація
  • Блог
    • Unix-подібні ОС
    • Php
    • MySQL
    • JavaScript
    • Менеджери пакетів
    • Docker
    • Seo
  • Допоміжні сервіси
    • Короткі посилання
    • Oбмін переглядами YouTube
  • Вхід
  • Реєстрація
  • Головна
  • Php
  • Що таке MVC чи з чого почати писати сайт?

Що таке 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.

17 Травня 18
1391
2

Відгуки

Файзулла

02 Березня 2019 20:28
Здравствуйте.
Немного ясно стало, но не совсем... в частности как соединять фронтенд с бакэндом
я хочу сайт сделать на РНР без шаблонизатора и фрэймворка, но в MVC/
Поможете? и вам материал на сайт будет )))
8

root-i

02 Березня 2019 22:33
Добрый день, Файзулла.
В общем view/product_view.php это и есть подключаемая фронтовая страница.
Для каждого контроллера можно создать свой фронтовый php файл. Можно поиграться с расширением структуры на namespace.
Я привел только стркутурный пример, чтобы показать что такое MVC. Так же есть еще HMVC, но не будем углубляться)
В любом случае тема эта большая и должна исходить из задачи, которую желают видеть в проекте)
Можно разобрать какай-то индивидуальный пример для Вас, отпишите через обратную связь если есть желание)
11
Ім'я
Електронна пошта
Рейтинг
Відгук

Інші статті з категорії

25 Квітня 2022

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

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

19 Червня 2019

Шаблони ImageCMS 4.10-4.12.1

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

26 Січня 2019

Довге зберігання кошика в інтернет-магазині

Розглянемо варіанти популярних варіантів зберігання товарів у кошику в інтернет-магазині. Позначимо плюси та мінуси таких зберігання. Розглянемо варіанти довгострокового зберігання корзини.

17 Січня 2019

Ключ-ліцензія для ImageCMS 4.9-4.12.1 Pro та Pre

Створення ключа для imageCMS 4.9-4.12.1 Pro та Pre. Для отримання авторизуватися.

07 Грудня 2018

$_SERVER[DOCUMENT_ROOT] у CLI або Cron

При запуску скрипта з консолі немає DOCUMENT_ROOT в $_SERVER. Спробуємо обійти це своїми шляхами, відловити директорію файлу.

31 Жовтня 2018

Аналіз навантажених частин Php коду за допомогою xhprof

Після розробки будь-якого інструменту на PHP стає питання, наскільки створений код ресурсний і які елементи він зачіпає ще. Розглянемо установку xhprof, налаштування та розглянемо способи роботи з xhprof.

18 Липня 2018

Угруповання умов у запиті ORM Propel (condition, combine)

Розберемо можливість об'єднання умов у запиті груп у Propel. Розглянемо приклад фільтрації по полях за допомогою -> condition () і -> combine ().

14 Червня 2018

Авторизація 1С на сайті PHP_AUTH_USER на CentOS apache

Зіткнувся із проблемою авторизації 1с на сайті. Сервер чомусь не приймав від неї параметр PHP_AUTH_USER і PHP_AUTH_PW. Розглянемо докладніше рішення та обхід даних параметрів $_SERVER .

Категорії

  • Unix-подібні ОС
  • Php
  • MySQL
  • JavaScript
  • Менеджери пакетів
  • Docker
  • Seo

Останні коментарі

Добрый день, Сергей. Я на более новых версиях блют...
root-i
23.02.23
Пробовал на transmart колонке. Ничего из перечисле...
Сергей
20.02.23
HenryMit, может быть
root-i
07.02.23
Неофрейдизм — это… Определение, принципы, представ...
HenryMit
07.02.23

Ділюсь інформацією у якій я вимагав допомоги та розбираючись витрачав багато часу. Якщо інформація допомогла хоча б одній людині, то цей сайт створений не дарма.

Подяка на продовження роботи сайту:
Контакти

Telegram Viber Mail

Пошук по сайту

  • Вхід
  • Реєстрація

Сайт працює на chmod -R