Как стать автором
Обновить

MVC для новичков на примере маленького информационного сайта (без использования ООП)

1. Вступление

Как и все начинающие Web разработчики сначала я изучал HTML потом CSS. Поскольку я сторонник мнения того что лучшее обучение — это практика, то тут же практиковал создание маленького информационного сайта путем выученных технологий. Когда же я перешел к изучению PHP, то столкнулся с небольшой проблемой: как его применять на практике, для продолжения создания моего сайта? Конечно первым делом я переименовал Index.html в Index.php, и разбил его на различные файлы *.php которые просто содержали контент блоков html. Но когда дело дошло до работы с базой данных — то уже начинало получаться как-то не очень красиво, и я решил посмотреть вообще на логику (архитектуру) построения CMS систем. Наиболее понятной для меня стала архитектура MVC. Я тут же решил взяться за ее освоение на практике. Но поскольку все (даже самые простенькие) примеры построения CMS с использованием MVC были написаны с применением ООП, то мои потуги что-то понять, заканчивались на разборе кода работы роутера. И тогда я решил сделать свою маленькую CMS систему с применением концепции MVС, но на уровне процедурного стиля программирования. Уж очень хотелось «пощупать» MVC в живую.

2. Немного теории

Как устроена логика MVC уже много где написано, но для понимания общей картины я все же повторюсь в двух словах. Итак, все содержимое приложения (в нашем случае сайта) разбито на 3 основных блока: Модель (M-model), представление (V-view) и контроллер (C-controller). Контроллер является «коммандиром» всего приложения и принимает основные решения. Представление хранит в себе html разметку сайта (визуальную часть приложения). А модель — работает с базой данных сайта. И все это работает как правило через единую точку входа — файл Index.php.

В нашем случае мы будем применять эту концепцию на примере создания маленького одностраничного информационного сайта о рыбалке. В общих чертах это работает так: пользователь попадает на наш сайт Index.php, делает какое-либо действие, Index.php передает управление на контроллер, который обрабатывает это действие, и в зависимости от того что это за действие — контроллер подключает вид. В виде запрашивается модель и выводится все это пользователю обратно.

Итак что будет делать наш сайт? Всего два действия: первое — выводить на главную страницу
небольшие отрывки (анонс) статей хранящихся в базе данных, и второе — по нажатии на любую из статей — выводить ее полный текст в блоке главной страницы.

Рассмотрим это на примере. Действие1: пользователь перешел на главную страницу Index.php (запрос 1), тогда контроллер Front_controller.php подключает вид Shablon1.php внутри вида загружается файл модели Articls_preview.php которая делает выборку анонса свежих статей из базы данных MySQL и выводит их обратно в файл вида Shablon1.php как бы встраивая текст статей в html разметку вида Shablon1.php.

image

В результате на экран выведется главная страница с фрагментами свежих
статей:

image

3. Практика

Итак ознакомимся с файловой структурой нашего сайта:

image

Сайт называется fishing_blog_procedure, поэтому его корневая папка носит то же название.
Далее в ней стоит обратить внимание только на 3 папки: это model — в ней расположены файлы скриптов работы с базой данных, controllers — в которой расположен файл скрипта нашего контроллера, и view — в которой расположены файлы представления нашего сайта. В папке components расположен файл подключения к базе данных который используют файлы модели. Папка nbproject к делу не относиться — это лишь папка моей IDE.

Итак первым делом настроим наш сайт так, что бы все запросы к нему приходящие — попадали на Index.php: для этого в файл .htaccess внесем следующее:

DirectoryIndex index.php
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php

Не будим вдаваться в подробности — теперь все запросы будут перенаправляться на Index.php, тем самым организовывается как бы единая точка входа.

Далее откроем файл Index.php и подключим в нем файл контроллера:

<?php 

include 'controllers/Front_controller.php';

Откроем файл контроллера Front_controller.php и пропишем следующее:

<?php

$a = filter_input(INPUT_GET, 'r'); //проверяем, нет ли GET параметра r 

if (!$a) //если GET параметра 'r' нет - следовательно подключаем Shablon1.php
{
   include 'view/Shablon1.php';
}
else //если GET параметра r, есть - подключаем Shablon2.php
{
    include 'view/Shablon2.php';
}

Здесь происходит следующее: если пользователь находится на главной странице — то по GET ничего не передается и переменная $a не существует, как следствие — выполняется первое условие if и подключается файл шаблона главной страницы Shablon1.php
Откроем файл представления Shablon1.php и внесем в него простенькую html разметку нашей главной страницы:

<!DOCTYPE html>
<html lang="en">

	<head>
		<meta charset="UTF-8">
		<title>Блог о рыбалке</title>
		<link rel="stylesheet" href="css/reset.css">
		<link rel="stylesheet" href="css/style2.css">
	</head>
<body>
	<div>
            <header>
		 <img class="headerimg" src="img/header2.png">	
            </header>
                <div id="main">
                    <?php include 'model/Articls_preview.php'?>  
                </div>
               
                <footer>
                     Разнообразный и богатый опыт новая модель 
                     организационной деятельности представляет  
                     эксперимент проверки существенных финансовых 
            </footer>
	</div>
</body>
	</html>

Обращаю ваше внимание, что в центральном контейнере div мы подключаем файл модели Articls_preview.php (<?php include 'model/Articls_preview.php'?>), она будит выводить нам отрывки свежих статей из базы данных.

Далее перейдем к моделям и в файле Articls_preview.php напишем следующий код:

<?php

include 'components/Db_connect.php';
$query = "SELECT ID,Date,Categories,Articl_name,SUBSTRING(`Text`, 1, 200) FROM `Aticls`ORDER BY ID DESC LIMIT 5";

$result = mysqli_query($link, $query); 
while ($row = mysqli_fetch_assoc($result))
{      
    foreach($row as $value)
        {
         
         echo $value;
                  
          echo "<br>"; 
    }      
             $e = $row['ID'];
             
             echo "<p><a href= http://fishing_blog_procedure/index.php?r=$e>Читать далее...</a></p>";
              echo "<br>";
 }   
mysqli_close ($link);

  ?>

Здесь мы выполняем выборку статей из базы данных и к каждой из них в цикле подлепляем ссылку на главную страницу http://fishing_blog_procedure/index.php?r=$e, где в переменной $e передается ID статьи.

Теперь если пользователь нажмет на ссылку «Читать далее...» (Рисунок 3) на одной из выведенных статей, например с ID статьи 6, то в адресную строку попадет следующий код:
http://fishing_blog_procedure/index.php?r=6

Следовательно, контроллер Front_controller.php проанализировав данную информацию, увидит что параметр 'r', переданный по GET, теперь не пустой и содержит цифру 6. Следовательно, сработает другое условие else скрипта Front_controller.php и контроллер подключит нам файл Shablon2.php.

Внесем код в файл Shablon2.php (по сути, это копия Shablon1.php с той лишь разницей что вместо модели Articls_preview.php здесь подключается модель All_text_one_articl.php которая выводит полный текст одной статьи:

<!DOCTYPE html>
<html lang="en">

	<head>
		<meta charset="UTF-8">
		<title>Блог о рыбалке</title>
		<link rel="stylesheet" href="css/reset.css">
		<link rel="stylesheet" href="css/style2.css">
	</head>
<body>
	<div>
            <header>
		 <img class="headerimg" src="img/header2.png">	
            </header>
                <div id="main">
                    <?php include 'model/All_text_one_articl.php'?> 
                </div>
               
                <footer>
                     Разнообразный и богатый опыт новая модель 
                     организационной деятельности представляет  
                     эксперимент проверки существенных финансовых 
            </footer>
	</div>
</body>
	</html>

Итак остается внести код в файл модели All_text_one_articl.php которая будит делать выборку всего текста одной статьи, и на этом с кодом можно закончить:

 <?php
$a = $_GET["r"];
require_once 'components/Db_connect.php';
$query = "SELECT ID,Date,Articl_name,Text FROM `Aticls` Where `ID` = $a";
$result = mysqli_query($link, $query); 
while ($row = mysqli_fetch_assoc($result))
{     
     echo "<br>";
    foreach($row as $value)
        {
        echo $value;
         echo "<br>";
           echo "<br>";
             echo "<br>";
        }
              }  

Как видим в строке запроса $query = "SELECT ID,Date,Articl_name,Text FROM `Aticls` Where `ID` = $a"; мы подставляем ID статьи полученной из адресной строки http://fishing_blog_procedure/index.php?r=6 путем вычленения ее из массива GET: $a = $_GET["r"]; Таким образом если на главной странице пользователь нажмет «Читать далее...» в статье с ID=6 то он увидит следующую страницу:

image

4. Выводы: В данной статье мы рассмотрели простейшую реализацию архитектуры построения приложения по MVC. Надеюсь всем начинающим это будет в помощь. Всем удачи!

Ссылка на GIT-hub
Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.