Skip to content

Latest commit

 

History

History
302 lines (217 loc) · 14.8 KB

25_mvc_composer.md

File metadata and controls

302 lines (217 loc) · 14.8 KB

Model View Controller, Composer и как с "этим" теперь жить?

Вместо предисловия

Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живёте

Rick and Morty

Model View Controller

Я был готов к нападению любого психа. У меня была вилка.

Model-View-Controller (MVC, «Модель-Представление-Контроллер», «Модель-Вид-Контроллер») — схема разделения данных приложения, пользовательского интерфейса и управляющей логики на три отдельных компонента: модель, представление и контроллер — таким образом, что модификация каждого компонента может осуществляться независимо.

Модель (Model) предоставляет данные и реагирует на команды контроллера, изменяя своё состояние. Представление (View) отвечает за отображение данных модели пользователю, реагируя на изменения модели. Контроллер (Controller) интерпретирует действия пользователя, оповещая модель о необходимости изменений.

chego

За счет разделения у нас появляются более широкие возможности повторного использования кода (наследование). Особенно это помогает, когда пользователь должен видеть те же самые данные в различных контекстах и/или с различных точек зрения.

Схема работы

mvc-01

Controller

Я человек простой. Вижу запрос и сразу его обрабатываю!

simple_man

По сути задачи контроллера можно разделить на 2 части

  1. Обработка запроса Request
  2. Выдача ответы Response

Controller является некой "прослойкой" между Model и View Существует два понятие это Fat Controllers и Slim Controllers

Fat Controller

fat_controller

Характеристика Controller в том случае если большая часть логики(или вся) содержится в контроллере

do_not

Slim Controller

catana

Характеристика Controller в котором вся основная логика сводится к обработке запроса и возвращении ответа.

View

circk

View (Представление) отвечает за получение необходимых данных из модели и отправляет их пользователю. Представление не обрабатывает введённые данные пользователя

Нет! Нельзя в view вычислять формулы. Нет! Hельзя из view делать запросы в базу данных!

View оперирует только за отображение данных которые приходят из вне. В данном случае из Controller

Model

model

Под Model, обычно понимается часть содержащая в себе функциональную бизнес-логику приложения. Модель должна быть полностью независима от остальных частей продукта. Модельный слой ничего не должен знать об элементах дизайна, и каким образом он будет отображаться. Достигается результат, позволяющий менять представление данных, то как они отображаются, не трогая саму Модель.

Модель обладает следующими признаками:

  • Модель — это бизнес-логика приложения;
  • Модель обладает знаниями о себе самой и не знает о контроллерах и представлениях;
  • Для некоторых проектов модель — это просто слой данных (DAO, база данных, XML-файл);
  • Для других проектов модель — это менеджер базы данных, набор объектов или просто логика приложения;

Composer

composer

Composer — это пакетный менеджер уровня приложений для языка программирования PHP, который предоставляет средства по управлению зависимостями в PHP-приложении.

В мире PHP существует достаточно много готовых решений. Например для работы с кешом нам не обязательно писать свою реализацию, мы можем взять готовую библиотеку или пакет. Каждый пакет(библиотека) может зависить от другого пакета(библиотеки) той или инной версии. Composer помогает следить за зависимостями пакетов

Итак, Composer — менеджер пакетов для PHP.

packet

Пример реального composer.json для проекта на Symfony

{
    "type": "project",
    "license": "proprietary",
    "require": {
        "php": "^7.1.3",
        "ext-ctype": "*",
        "ext-iconv": "*",
        "api-platform/api-pack": "^1.2",
        "easycorp/easyadmin-bundle": "^2.3",
        "symfony/console": "4.3.*",
        "symfony/dotenv": "4.3.*",
        "symfony/flex": "^1.3.1",
        "symfony/framework-bundle": "4.3.*",
        "symfony/yaml": "4.3.*"
    },
    "require-dev": {
        "symfony/maker-bundle": "^1.14"
    },
    "config": {
        "preferred-install": {
            "*": "dist"
        },
        "sort-packages": true
    },
    "autoload": {
        "psr-4": {
            "App\\": "src/"
        }
    },
    "autoload-dev": {
        "psr-4": {
            "App\\Tests\\": "tests/"
        }
    },
    "replace": {
        "paragonie/random_compat": "2.*",
        "symfony/polyfill-ctype": "*",
        "symfony/polyfill-iconv": "*",
        "symfony/polyfill-php71": "*",
        "symfony/polyfill-php70": "*",
        "symfony/polyfill-php56": "*"
    },
    "scripts": {
        "auto-scripts": {
            "cache:clear": "symfony-cmd",
            "assets:install %PUBLIC_DIR%": "symfony-cmd"
        },
        "post-install-cmd": [
            "@auto-scripts"
        ],
        "post-update-cmd": [
            "@auto-scripts"
        ]
    },
    "conflict": {
        "symfony/symfony": "*"
    },
    "extra": {
        "symfony": {
            "allow-contrib": false,
            "require": "4.3.*"
        }
    }
}

Если внимательно посмотреть на пример выше мы можем увидеть что на данный момент Composer может не только устанавливать пакеты но и многое другое

В рамках данного занятия нам нужно рассмотреть только возможность автозагрузки в нашем простом проекте MVC

Для этого в корне проекта нам нужно запустить следующую коомманду

composer init

В результате должно получится следующий composer.json

{
    "name": "pusachev/mvc", 
    "description": "simple mvc example",
    "type": "project",
    "license": "mit",
    "authors": [
        {
            "name": "Pavel Usachev",
            "email": "[email protected]"
        }
    ],
    "autoload": {
        "psr-4": {
            "": "src/"
        }
    },
    "minimum-stability": "stable",
    "require": {}
}
  • name название проекта через / по правилу Namespace/ProjectName. Имя должно быть уникально по нему composer ищет пакеты Link
  • description это описание нашего проекта, не обязательно Link
  • type это наш тип project, lib, package, ect. Link
  • license Лицензия под которым распространяется проект. Link
  • authors Автор или авторы разработавшие это решение. Link
  • autoload Указывает неймспейс и папку для автозагрузки классов. Link
  • minimum-stability Минимальная версия устанавливаемых пакетов. Link
  • require Список установленных пакетов. Link

Для того что бы нам установило пакеты и сгенерировало autoload нам нужно запустить следующую команду

composer install

Данная комманда генерирует нам файл composer.loc в котором содержится древо зависимостей Если файл composer.loc уже сгенерирован, то начнется сразу же установка пакетов

При установке нового пакета или обновлений существующего composer.loc генерируется заново

Для установки нового пакета нужно использовать следующую команду

composer require symfony/console

Данная комманда установит нам пакет symfony/console самой последней стабильной версии. Если нам нужно будет установить конкретную версию пакета нам нужно будет указать его версию

composer require symfony/[email protected]

Для обновление отдельно пакета используется следующая команда

composer update symfony/console

Для обновление всех зависимостей нам нужно использовать команду без указания конкретного пакета

composer update 

Практика

Simple MVC

Home work

Слышал MVC

Пользуясь примером выше(и следуя парадигмам), создать простенький проект который при заходе еа главную страницу выводит следующую картинку jeck_sparrow

И текс под ней "Все видели как я это сделал? Ибо я отказываюсь это повторять". В данном задании пользоватся composer не обязательно

Видел MVC

Пользуясь примером выше(и следуя парадигмам), создать простенький проект который при заходе еа главную страницу выводит следующую картинку jeck_sparrow

И текс под ней "Все видели как я это сделал? Ибо я отказываюсь это повторять". При этом обязательно создаь проект используя Composer

MVC Стиль моей жизни

Пользуясь примером выше(и следуя парадигмам), создать простенький проект который при заходе еа главную страницу выводит следующую картинку jeck_sparrow

А внизу него ссылка которая ведет на отдельную страницу. На отдельной странице будет текст "Все видели как я это сделал? Ибо я отказываюсь это повторять". При этом обязательно создать проект используя Composer. Текст должен братся из базы данных.

Псс парень, ты уже видел мой errorHandler?

Сделать все из задачи MVC Стиль моей жизни и добавить ксвой обработчик ошибки что бы в случае любой ошибки выводилась наша страница 502 ошибки со следующим изображение

bender

Источники

Паттерны для новичков: MVC vs MVP vs MVVM

Wikipedia Model-View-Controller

Composer

Как nginx обрабатывает запросы

mod_rewrite — просто о сложном

The MVC Pattern and PHP, Part 1

The MVC Pattern and PHP, Part 2

PSR-0: Autoloading Standard

Автозагрузка, неймспейсы и PSR-4