Pull to refresh

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
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.
Change theme settings