Создание php MVC приложения. Конфигурация и создание главной страницы

Главная » Видеоуроки » PHP+MySQL » Создание php MVC приложения. Конфигурация и создание главной страницы
В этом уроке мы начнем разработку нашего приложения — напишем конфигурационные файлы подключения необходимых классов, класс для подключения к базе данных и роутинг. Также мы создадим родительские классы модели, контроллера и вьюхи, а также модель, контроллер и вьюху для главной страницы (форма авторизации)
Прежде всего нам надо начать с файла index.php. В нем мы просто подключим файл конфигурации (см. код файла index.php).

Код урока (файл index.php)

<?php

require_once("conf/config.php");
В конфигурационном файле мы определим общие для всего приложения константы, а также подключим общие файлы (модель, контроллер и представление, класс соединения с базой данных и роутинг) и запустим метод определения маршрута (URL) приложения (см код conf.php).

Код урока (файл conf.php)

<?php

define("ROOT", "/var/www/u0016495/data/www/cabinet.kamil-abzalov.ru");
define("CONTROLLER_PATH", ROOT. "/controllers/");
define("MODEL_PATH", ROOT. "/models/");
define("VIEW_PATH", ROOT. "/views/");

require_once("db.php");
require_once("route.php");
require_once MODEL_PATH. 'Model.php';
require_once VIEW_PATH. 'View.php';
require_once CONTROLLER_PATH. 'Controller.php';


Routing::buildRoute();
Теперь нам нужно написать класс для соединения с базой данных. Этот класс будет статическим. Для подключения к базе данных я буду использовать PDO (см файл db.php).

Код урока (файл db.php)

<?php

/**
** Класс конфигурации базы данных
*/
class DB{

	const USER = "u0016495_cabinet";
	const PASS = 123456;
	const HOST = "localhost";
	const DB   = "u0016495_cabinet";

	public static function connToDB() {

		$user = self::USER;
		$pass = self::PASS;
		$host = self::HOST;
		$db   = self::DB;

		$conn = new PDO("mysql:dbname=$db;host=$host", $user, $pass);
		return $conn;

	}
}
Теперь подробно разберем файл route.php. Как уже упоминалось, мы разрабатываем приложение, используя подход MVC. Естественно, нам не стоит создавать свой файл под каждую страницу — это абсолютно неверно и непрофессионально. За нас это будет делать роутинг. В действительности, когда мы ходим по сайту, мы запрашиваем у него какое-либо действие (получить список пользователей, открыть форму для регистрации и прочее). Причем на одной странице мы можем получить список пользователей и список товаров. То есть одна страница объединяет в себе несколько действий (задач). Страница в нашем случае будет называться контроллером, а задачи — actions. Контроллер — это класс, а actions — методы этого класса.
В начале файла роутинга мы определим контроллер и action по умолчанию — indexController и index action. В остальном же мы будем брать часть адреса страницы (используя $_SERVER[‘REQUEST_URI’]) и разбивать ее на две части — контроллер и action. Например, адрес /cabinet/users подразумевает подключения контроллера CabinetController.php и вызов в нем метода users().
В роутинге определены четкие правила именования файлов — имя файла с большой буквы и с префиксом Controller. Например, IndexController, UserController и так далее.

Код урока (файл route.php)

<?php

/*
** Класс маршрутизации
** Урл http://cabinet.kamil-abzalov.ru/
** Урл http://cabinet.kamil-abzalov.ru/cabinet
** Урл http://cabinet.kamil-abzalov.ru/cabinet/users
** Урл http://cabinet.kamil-abzalov.ru/cabinet/orders/
** Урл http://cabinet.kamil-abzalov.ru/cabinet/orders?orderId=
*/

class Routing {

	public static function buildRoute() {

		/*Контроллер и action по умолчанию*/
		$controllerName = "IndexController";
		$modelName = "IndexModel";
		$action = "index";

		$route = explode("/", $_SERVER['REQUEST_URI']);

		/*Определяем контроллер*/
		if($route[1] != '') {
			$controllerName = ucfirst($route[1]. "Controller");
			$modelName = ucfirst($route[1]. "Model");
		}


		require_once CONTROLLER_PATH . $controllerName . ".php"; //IndexController.php
		require_once MODEL_PATH . $modelName . ".php"; //IndexModel.php

		if(isset($route[2]) && $route[2] !='') {
			$action = $route[2];
		}

		$controller = new $controllerName();
		$controller->$action(); // $controller->index();

	}

	public function errorPage() {

	}


}
После этого нам нужно создать общие (родительские) классы контроллера, модели и view. В них я вынес общие задачи для всех дочерних контроллеров (см файлы Controller.php, Model.php, View.php).

Код урока (файл Controller.php)

<?php

class Controller {

	public $model;
	public $view;
	protected $pageData = array();

	public function __construct() {
		$this->view = new View();
		$this->model = new Model();
	}	

}

Код урока (файл Model.php)

<?php

class Model {
	protected $db = null;

	public function __construct() {
		$this->db = DB::connToDB();
	}
}

Код урока (файл View.php)

<?php

class View {


	public function render($tpl, $pageData) {
		include ROOT. $tpl;
	}

}
Теперь нам осталось написать код для IndexController и создать вьюху. Вьюху (фору авторизации) я взял по этой ссылке
В IndexController мы определим indexAction() метод, в котором запустим метод класса View — render(). Этот метод отрисовывает html в браузер, принимая два параметра — шаблон для отрисовки и массив с динамически данными страницы — заголовок страницы, сообщения и прочее. IndexModel мы пока оставим пустым и реализуем его на следующем уроке.

Код урока (файл IndexController.php)

<?php

class IndexController extends Controller {

	private $pageTpl = '/views/main.tpl.php';


	public function __construct() {
		$this->model = new IndexModel();
		$this->view = new View();
	}


	public function index() {
		$this->pageData['title'] = "Вход в личный кабинет";
		$this->view->render($this->pageTpl, $this->pageData);
	}



}

Код урока (файл main.tpl.php)

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title><?php echo $pageData['title']; ?></title>
	<meta name="vieport" content="width=device-width, initial-scale=1">
	<link rel="stylesheet" href="/css/bootstrap.min.css">
	<link rel="stylesheet" href="/css/font-awesome.min.css">
	<link rel="stylesheet" href="/css/style.css">
</head>
<body>
	
	<header></header>

	<div id="content">
		<div class="container">
    <div class="row">
        <div class="col-sm-6 col-md-4 col-md-offset-4">
            <h1 class="text-center login-title">Sign in to continue to Bootsnipp</h1>
            <div class="account-wall">
                <img class="profile-img" src="https://lh5.googleusercontent.com/-b0-k99FZlyE/AAAAAAAAAAI/AAAAAAAAAAA/eu7opA4byxI/photo.jpg?sz=120"
                    alt="">
                <form class="form-signin">
                <input type="text" class="form-control" placeholder="Email" required autofocus>
                <input type="password" class="form-control" placeholder="Password" required>
                <button class="btn btn-lg btn-primary btn-block" type="submit">
                    Sign in</button>
                <label class="checkbox pull-left">
                    <input type="checkbox" value="remember-me">
                    Remember me
                </label>
                <a href="#" class="pull-right need-help">Need help? </a><span class="clearfix"></span>
                </form>
            </div>
            <a href="#" class="text-center new-account">Create an account </a>
        </div>
    </div>
</div>
	</div>

	<footer>
		
	</footer>


	<script src="/js/jquery.js"></script>
	<script src="/js/bootstrap.min.js"></script>
	<script src="/js/angular.min.js"></script>
	<script src="/js/script.js"></script>


</body>
</html>

Код урока (файл IndexModel.php)

<?php

class IndexModel extends Model {

	

	
}

10 комментариев

  1. Кирилл

    Спасибо, подсмотрел для себя полезные вещи

    Ответить
    • Камиль

      Здравствуйте, Кирилл. Спасибо большое за комментарий. Главное — не ориентируйтесь только на мои уроки. Я тоже могу делать ошибки.

      Ответить
  2. Николай

    Добрый день, очень полезные уроки. Учусь по ним

    Ответить
    • Камиль

      Здравствуйте, Николай.
      Спасибо вам большое за комментарий. Желаю вам успехов

      Ответить
  3. Слава

    Здравствуйте, доступно объясняете сложные вещи. Спасибо огромное за уроки.
    К этому уроку стили потерялись, и еще хорошо есои бы тут ссылки были на следующий или предыдущий урок.
    Еще раз Спасибо

    Ответить
  4. Faizulla

    Камиль, здравствуйте.
    Как подключить GRID css, убрав bootstrap.min.css и font-awesome.min.css

    Ответить
    • Камиль

      Здравствуйте. Вы имеете в виду, только bootstrap сетку? Смело убирайте bootstrap.min.css и font-awesome.min.css. Просто дело в том, что данный шаблон я скачал отсюда — https://startbootstrap.com/themes/sb-admin-2/.
      Как видите, эти шаблоны основаны на bootstrap

      Ответить
    • Камиль

      Здравствуйте, Юрий. Спасибо за ваш комментарий. У меня произошел сбой в работе wordpress (из-за плагина), поэтому код утерян. Прошу прощения

      Ответить

Оставить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *


Срок проверки reCAPTCHA истек. Перезагрузите страницу.

Pin It on Pinterest

Share This