• Авторизация


Паттерн MVC в языке PHP 03-07-2014 08:38 к комментариям - к полной версии - понравилось!


Вот и "дорос" до понимания паттернов (шаблонов). Интуитивно уже давно к этому шел и наконец прозрел. Идея хорошо изложена в этом видео:



Теперь разберусь в рабочем примере, взятом с YOUTUBE:



Файл login.php:
<html>
<head>
<style>
    #login-controls {
        margin: 0 auto;
        border: 1px solid #ccc;
        padding: 50px;
        width: 300px;
    }
    .error-text{
        color: #f00;
    }
</style>
</head>
<body>
<div id="login-controls">
    <h2>Login</h2>
    <form method="POST" action="index.php">
        <p>Username:<br />
        <input type="text" name="user" />
        </p>
        <p>Password:<br />
        <input type="password" name="pass" />        
        </p>
        <input type="submit" name="op" value="login" />
    </form>
</div>
</body>
</html>

Здесь все просто: обычный HTML-код для отображения формы. Заполненные поля передаются файлу index.php:

<?php

require_once('user_controller.inc.php');
require_once('user_model.inc.php');

@$op = $_REQUEST['op'];

$user_controller = new UserController();

switch($op){
    case 'login':
        $username = $_POST['user'];
        $password = $_POST['pass'];
    
        if ($user_controller -> login($username,$password)){
            header("Location:main.php");
        }else header("Location:login.php?err=1");
    break;
    
    case 'logout':
        $user_controller -> logout();
        header("Location:login.php");
    break;
    
    default:
        header("Location:login.php");
    break;
}
?>

В файле index.php:

  • подключаются файлы user_controller.inc.php и user_model.inc.php;
  • создается обьект UserController;
  • проверяется значение полученной от файла login.php переменной "op".

Предусмотрены три варианта. Если переменная "op" имеет значение:

  1. "login" - контроллер проверяет доступ и, в случае успеха, открывется страница main.php. если авторизация не прошла, то возврат на страницу login.php с кодом ошибки err=1;
  2. "logout" - контроллеру сообщается об отключении и возврат на страницу login.php без кода ошибки;
  3. любое другое, либо не определено - возврат на страницу login.php без кода ошибки.

Разбираюсь с контроллером (обьект UserController) и смотрю файл user_controller.inc.php:

<?php
class UserController {  
    function UserController() //constructor
    {

    }

    function create($username,$password,$email){   
    }
    function login($username,$password){
        if ($this->authenticate($username,$password)){
            session_start();
            $user = new UserModel($username);
            $_SESSION['user']=$user;
            return true;
        }else{
            return false;
        }
    }
    static function authenticate($u,$p){
        $authentic=false;
        if($u=='admin' && $p =='admin') $authentic=true;
        return $authentic;
    }
    function logout(){
        session_start();
        session_destroy();
    }
}
?>

Класс содержит 4 метода:

  • с таким же названием, как класс. Это конструктор, он нужен для инициализации новых обьектов. Собственно код отсутствует;
  • login() - метод обращается к методу authenticate и в случае успешной авторизации начинает новую сессию и создается экземпляр класса UserModel для доступа к данным. Таким образом, доступ к данным возможен лишь после успешной авторизации;
  • authenticate;
  • logout.

Вернусь к рассмотрению файла index.php. Если метод login() контроллера $user_controller вернет значение "true", то загрузится страница main.php.

Файл main.php:

<?php
 require_once('user_model.inc.php');
 session_start();
 if(!isset($_SESSION['user'])){
    header("Location:login.php");
 }else{
    $user = $_SESSION['user'];
 }
?>
<html>
<head>
</head>
<body>
    <p>
    You are now logged in <?php print $user->get_username()?>
    ...this is the main.
    <a href="index.php?op=logout">Logout</a>
    </p>
</body>
</html>

Чисто для демонстрации работы с данными через класс UserModel в файле main.php выводится имя пользоателя через метод get_username().

И, наконец, некоторый демо-вариант файла user_model.inc.php:

<?php

class UserModel{
    private $username;
    
    function UserModel($username){
        $this->username = $username;
    }
 
    function get_username(){
        return $this->username;
    }
 
    function set_username($username){
        $this->username = $username;
    } 
}
?>

Для модели MVC (model-view-controller) назначение файлов такое:

  • Model: user_model.inc.php
  • View: login.php, main.php
  • Controller: index.php, user_controller.inc.php

В этом примере 2 точки входа:  файлы index.php и login.php

Разбор примера закончен.

 

Использованные источники:

  1. Ляпин,Никитин, "PHP - это просто", БХВ-Петербург, 2012
вверх^ к полной версии понравилось! в evernote


Вы сейчас не можете прокомментировать это сообщение.

Дневник Паттерн MVC в языке PHP | a1addin - Письма себе | Лента друзей a1addin / Полная версия Добавить в друзья Страницы: раньше»