Создание 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 и так далее.
В начале файла роутинга мы определим контроллер и 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 мы определим 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 {
}
Спасибо, подсмотрел для себя полезные вещи
Здравствуйте, Кирилл. Спасибо большое за комментарий. Главное — не ориентируйтесь только на мои уроки. Я тоже могу делать ошибки.
Добрый день, очень полезные уроки. Учусь по ним
Здравствуйте, Николай.
Спасибо вам большое за комментарий. Желаю вам успехов
Здравствуйте, доступно объясняете сложные вещи. Спасибо огромное за уроки.
К этому уроку стили потерялись, и еще хорошо есои бы тут ссылки были на следующий или предыдущий урок.
Еще раз Спасибо
Здравствуйте. Спасибо большое за вашу оценку и советы. Стили можно скачать отсюда — http://www.samara.computer/531_adaptive/startbootstrap-master/startbootstrap-master/sb-admin-v2.php
Камиль, здравствуйте.
Как подключить 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
Добрый день! Огромное спасибо за урок № 94! Но смею заметить, что Вы не указали: Код урока (файл style.css) (время- 50.47) из
https://bootsnipp.com/snippets/featured/google-style-login
Правда сейчас этот код переехал на адрес:
https://bootsnipp.com/snippets/d2eZ
Здравствуйте, Юрий. Спасибо за ваш комментарий. У меня произошел сбой в работе wordpress (из-за плагина), поэтому код утерян. Прошу прощения