Текст (субтитры) к видео на Youtube

Описание: Первый урок серии скринкастов по изучению PSR-7 микрофреймворков в PHP. Создание структуры директорий, написание объектов для взаимодействия с HTTP-протоколом и тестирование с помощью PHPUnit.

Обсуждение и исходники: http://www.elisdn.ru/blog/113/psr7-framework-http

00:00:00 - Вступление
00:01:09 - Что такое фреймворк
00:06:29 - История JavaScript
00:10:30 - История PHP
00:15:18 - Ключевые нововведения в PHP
00:19:13 - Composer - пакетный менеджер
00:25:15 - Обратная сторона компонентного подхода
00:28:00 - Начало создания проекта
00:31:04 - GET-запрос
00:32:45 - Что происходит на сервере, REST Client
00:37:18 - Cуперглобальные массивы
00:38:06 - Функция getLang
00:42:50 - Ассоциативный массив
00:44:07 - Класс Request
00:46:04 - Вынесение классов проекта
00:47:15 - Импорт классов
00:49:46 - Правила именования методов
00:54:19 - Автозагрузка с помощью Composer
00:54:53 - Секция "require"
00:55:42 - Секция "config"
00:58:58 - Секция "autoload"
01:03:31 - PHPUnit
01:07:29 - RequestTest
01:12:33 - Секция "require-dev"
01:13:53 - Секция "scripts"
01:17:16 - Неудобство глобальных параметров
01:22:29 - Сеттеры и мутаторы
01:26:25 - Недостатки сеттеров
01:29:05 - Иммутабельные объекты
01:33:08 - Фабрика RequestFactory
01:34:24 - Ответ сервера
01:36:54 - ResponseTest
01:39:37 - Цикл жизни приложения
01:41:09 - Класс Response
01:42:56 - Повторное использование, адаптеры
01:50:21 - PSR-7
01:52:42 - ServerRequestInterface
01:53:07 - ResponseInterface
01:54:33 - Отличия наших интерфейсов от PSR
01:58:32 - Подключение zend-diactoros
02:03:02 - Удаление наших классов и тестов
02:04:08 - ResponseSender и SapiEmitter
02:06:43 - SapiStreamEmitter
02:09:22 - Подведение итогов

Субтитры:

здравствуйте с вами дмитрий eliseev
сегодня мы начинаем серию скринкастов по
написанию в образовательных целях
компонентного ешьте типе framework для
чего нам это нужно если уже есть готовый
чужие фреймворке чтобы изучить что-то
большое действие не всего самому пройти
тот же путь который проходит автор этого
продукта
изучить какие мысли его посещали с
какими задачами он сталкивался какими
путями он их решал другими словами нам
нужно рассмотреть всю эволюцию этого
проекта и только пошагового изучив чужой
проект таким последовательным путем мы
можем прийти к такому же результату
которому пришел его автор и после этого
мы уже сами будем не только хорошо знать
этот продукт но и понимать каждый его
элемент внутри него и так мэтт
досконально разберемся в устройстве
существующих фреймворков и микро
фреймворков и на этом примере изучим
какие существуют современные подходы
тенденции подхода к разработке и какие
уже есть готовые инструменты которые
могут нам помочь и так мы в течение этих
нескольких уроков пошагового перри
изобретем компонентный фреймворк уделим
внимание двум ключевым словам этой фразы
компонентные фреймворк сначала
рассмотрим что такое фреймворк в нашей
системе возьмём слово фреймворк и
посмотрим что это такое и чем же он
отличается от библиотеки
например если у нас есть какой-нибудь
проект он может использовать другие
библиотеки то есть если у нас
какой-нибудь есть проекта 1 или ещё
что-нибудь такое
то он может использовать внутри себя
библиотеку один библиотеку 2 что это за
библиотеки и
[музыка]
нам нам сейчас совершенно не важно что
это за библиотеки это могут быть любые
маршрутизаторы любые шаблонизатор и
любые вещи которые только могут быть
написаны на любом языке программирования
в данном случае мы рассматриваем с вами
язык печки то при нем поэтому
представьте что это любые библиотеки
написанные языке .
если у нас есть некий проект который
использует некие чужие библиотеки то это
одно дело другое же дело когда у нас
есть framework фрэймворк это другая вещь
это вещь наоборот это внешний каркас в
котором мы помещаем наш проект то есть
если у нас был проект который
использовал чужие библиотеки то
фреймворк это вещь куда мы наоборот
помещаем наш проект внутрь него
соответственно у проекта библиотеке
находится внутри проекта a framework
находится снаружи проекта если мы пишем
что-то с нуля то мы свободно делать все
что как мы хотим но если создаем
приложения на любом там лара в laravel
симфония и подобных фреймворков хоть
slim хоть ещё что-нибудь такое то они
уже заботятся о рутине
вместо нас и предоставляют на места и
базовой конструкции куда мы можем
вставлять свой код то есть у них есть
базовый класс контроллер предположим от
которого мы можем наследоваться и код
своих контроллеров писать уже внутри
этих классов которые наследуют базовый
класс контроллер он может быть
иметь базовые классы каких-нибудь
сущностей каких-нибудь правил
маршрутизации и всего остального что нам
только понадобится в нашей жизни поэтому
framework предоставляет там некую эту
систему на основе которой мы можем
построить свой проект of в отличие от
простого написания с нуля при фреймворк
предоставляет свою структуру папок или
директории если вдруг там у него такие
требования к этому есть но обычно
фреймворк не навязывает какую-нибудь
особую архитектуру но дима приложения на
этом фреймворке некий базовый каркас
приложения
уже содержит свою какой-нибудь
общепринятую структуру директорий куда
мы вкладываем свои объекты свой код
который нам ужин ужин
но при желании мы можем эту структуру
легко изменить ничего от этого сложного
не будет и нормальный фрибур нам
позволяет это делать если наш проект
перестает быть какими стандартным
маленьким сайте com на становится
большим
[музыка]
большой системы с несколькими точками
входа с несколькими разделами и с
разделением на консольное приложение
некие какого-нибудь
очередь задач и все это остальное то
любой фреймворк позволяет изменить свою
структуру под новые требования проекта
который мы разрабатываем это что
касается гибкий фреймворк но возможно
где-нибудь будут негибкие фреймворке
которые ты не позволит вот так в итоге
при работе с фреймворком мы идем таким
путем что сначала устанавливаем
фреймворк потом в нем пишем проект в
него помещаем свой код и уже при желании
при необходимости до устанавливаем все
библиотеки которые нам могут
понадобиться дальше например если по
умолчанию стандартной сборки нет
каких-нибудь компонентов по работе с
очередями мы его устанавливаем если нет
шаблонизатора моего до устанавливаем и
так таким путем мы можем установить
сколько угодно чужих компонентов чтобы
работать с ними в своем проекте
со словом фреймворк мы с вами
определились и теперь понимаем что это
некий каркас куда мы помещаем свой код
при этом могут быть и монолитной
фреймворке
который как сделано то сделано и ничего
с ними не поделаешь но при этом могут
быть и другие фреймворке так называемые
компонентные который мы сегодня
рассмотрим в которых можно некие вещи
подменять на свои собственные и в
некоторых фреймворков можно даже писать
код не привязанной к коду самого
фреймворка описать полностью своим рока
независимая структура
это мы тоже рассмотрим наш
примере а теперь рассмотрим после слова
framework рассмотрим слова компоненты
что это значит для чего это нужно и что
эта система у нас
компонента есть определяет для нашего
для нас как для разработчика но для
начала вспомним язык java script кто-то
его любит кто-то не любит кому-то без
разницы до него но нужно понимать что
такой язык уже есть если 10 или 15 лет
назад его использовали только чтобы
вывести где-нибудь часики в шапке сайта
то потом появился джек верим некая
библиотека которая позволяла работать с
анимацией
что имел атрибутами и многими другими
вещами которые с которыми было неудобно
работать в голом java скрипте
с поддержкой разных браузеров и так
появившиеся джек вере
это библиотека вдохнула новую жизнь в
разработку на java скрипте то есть все
сразу
накинулись на это джек вере и стали ее
использовать в практически везде
таким путем таким образом джек вере
вдохнул новую жизнь и разработка на java
скрипте но потом после этого джек вере
появилась у кого-то желание
разрабатывать не только клиентский код
но и серверный на этом языке java
скрипте чтобы не учить два языка или три
или больше для разработки разных вещей и
в итоге в какой то момент времени
придумали такую вещь как но джесс такую
разновидность некую некий такой
интерпретатор который обрабатывал и тот
же самый java script код но уже на
сервере соответственно со своими
нюансами немного отличающимся подходом
но все-таки он позволил использовать
один и тот же java script не только в
браузер и но еще и просто так консоли
или на сервере как самостоятельный
сервер и вот кнуд джессу в конце концов
придумали
некий пакетный менеджер npm с помощью
которого уже может
было загружать чужие библиотеки
подключать свой проект и спокойно имею
управлять внутри себя и в последнее
время появился еще так как появилась из
и другие сборщики
в конце концов появился сборщик в так
называется с появлением в пока
разработка на этого скрепите более так
упростилась и этот выпад позволил эти
разные библиотеки
собирать минимизировать сжимать код и
производить с ними всевозможные операции
то есть теперь java скрипте можно в
начале как он ведь файлика подключить
использование другой библиотеке и в
конце концов вы пока то все соберет в
один java script file который можно
отправить браузера и там будет работать
все что было перечислено в исходном
джесс файле если в этом но установили к
себе там 50 различных библиотек то в
итоге вы пак это все дело соберет в один
файл который можно будет отправить
браузер и там он будет нормально
работать в итоге java-script после таких
революционных вещей захватил большую
часть разработки
не только клиентской и серверной до чего
в начале
авторы java script особо так и не думали
что это до этого них дойдет но в итоге
на java скрипте пишут практически все до
чего доходят руки и клиентский код и
серверные всякие возможные утилиты
консольные многие люди пишут мобильные
приложения
но было бы их воле они бы и операционные
системы с драйверами сочиняли на java
скрипте
но вместо использования языков си си
плюс плюс но это уже другое дело нас не
касается но в итоге развитие на лицо из
первоначально никому мало кому интересно
языка java script превратился в
полноценный язык на котором пишут сейчас
практически все такое дело обстоит
спички
имеется ввиду если вначале автор пички
просмотр следов как его зовут изобретала
его просто чтобы побаловаться и вывести
некие часики также внутри html кода как
то так то есть вначале он назывался
[музыка]
просто как персонал home page тулс то
есть некий инструмент для построения
домами персональных домашних страничек в
итоге от такого подхода чтобы просто
вывести текущую дату в каком теге рядом
с html тестом сделать такие вкрапления в
html-код как делаются в креплении java
скрипта в итоге в какой то момент
времени язык пички перерос вполне себе
практически полноценный язык на котором
сейчас пишут все если вначале писали
такие занимались таким было в том-то в
конце концов переходили к написанию
целых гостевых книг форм обратно к связи
на сайтах и многих таких вещей не
понятно и в итоге в ходе эволюции он из
того самого названия персонала home page
тулс который непонятно кому нужны
превратился переименовался в некий
hitter текст препроцессор вроде как
более солидно и название у него
появилась и более солидные цели перед
ним стали
если раньше большего от него не ждали то
в какой то момент времени включая php в
нем вроде как начали зарождаться него
переноситься не интересные вещи которые
были уже в других языках которые активно
использовались для разработки
программного обеспечения только в печке
4 только в четвертой версии в нем только
только начал появляться на кое-какое
о.п.
вначале его там особо не было он был
чисто процедурным языком и только в 2004
году выпустился печки 5 в котором
уже что-то я переключился на четвертом
году выпустили 5550 версия которая
ознаменовала переход к нормальному
программирование языки пички тому же
применил появился меня и мая
объектно-ориентированное
программирование с модификаторами
доступов у элементов классов и появились
интерфейсы и дальше уже в печке 53
начали появляться анонимные функции
namespace и в версии 54 появились
trade-in то есть совсем недавно и судя
из википедии только в 2000 где-то
одиннадцатом или в двенадцатом году
появился can пакетный менеджер на
примере того самого npm и который был
not пакет менеджер который называется на
основе но же с еще и паркетных
менеджеров из других языков
программирования появился пакетный
менеджер печки который назвали composer
и он уже ознаменовал новую эпоху виде
самом языке . и новые подходы к
разработке то есть в конце концов
профессиональные инструменты из других
языков перекочевали .
и ими он обзавелся совсем недавно
практически пять или восемь лет назад
это к чему это все потому что эти
нововведения которые появились
сравнительно недавно если рассматривать
язык .
в сравнении с другими языками с тем же
самым все плюс плюсом шарпом может быть
джавой или продали тому подобном эти
нововведения появились печки совсем
недавно и эти нововведения не у всех
программистов еще устоялись прижились то
есть если вы читаете какие-нибудь книги
десятилетней давности папич перед даже
пятилетней давности то там нет и
использование ит хаба нет использования
composer и
и нет никаких новых подходов и ли там
какие-нибудь рекомендации которые
появились за последние годы
печки только последнее время динамически
развивается только недавно появился
появились версии 7071 где уже вроде как
появился типизация из похожие на java
но не совсем еще и это все есть но
процесс идет это появляется только
сейчас поэтому нужно читать новые книги
новую документацию и на старых особо не
зацикливаться и если мы подведем итог
под вот этим сказанном что появилось
недавно в печке и дополнен разберем
подробнее
что при вниз лось в мир разработчиков с
приходами кит хаба composer а и других
вещей то мы увидим такие основные вехи
затронули весь мир разработчиков на
языке пички всех php программистов это
во-первых появление
объектно-ориентированного
программирования php версии нормального
языка 50 потом появление социального
коденко с использование гитхаба и других
сайтов которые предоставляют публичной
репозитории и в конце концов появился
конден пакетный менеджер composer как
это относится к теме изучаемого наш нами
сейчас
проекта нашего фреймворка который мы
строим это на самом деле
к нам очень так относятся почему мы
сейчас рассмотрим первое если
рассматривать эти пункты то
как мы уже понимаем в развитии вы бы
привешен привело к тому что печки
нахлынуло много новых и старых
разработчиков новички новичков мы особо
в расчет не берем но так как у них
своего ничего нет в которые могут они
показать то есть новички не особо нового
ничего не привносит то только повторяют
за другими разработчиками она старых
программистов нужно обратить особое
внимание так как миграции опытных
программистов из других профессиональных
языков в новый любительский пищу и
принесла в него опробованные язык
командовавший из себя подходы например
строгую типизацию которая только-только
вводят даже для скалярных вещей которая
появилась только в печке 70 анонимные
функции появились они уже давно
относительно но все-таки появились и
интерфейсе как мы уже сказали появились
только пятой версии пеппе и на печке
форумов каждым на каждое такое изменение
сразу поднимаются крики что все больше и
больше и спички пытается из старого
доброго лампу любительского печка все
больше и больше пытаются сделать
монструозную сложную java
но с этим нужно смириться и понимать что
не только новички есть php и раз вы
захотели чтобы к вам приходили другие
разработчики из других языков с более
такими продвинутыми инструментами то
терпите что они в печке перетаскивать
свои любимые вещи которые ему нравились
других языках
это что касается в.п. второе это
социальный coding и
который ознаменовался приходом гитхаба в
нашу жизнь
что это такое социальный coding если
раньше каждой программе дружу что-то
только для себя и изредка выкладывал
своим блохи в виде zip архивов то сейчас
есть gedit и хип-хоп и которые позволили
в удобном виде выкладывать во-первых
свой код и во-вторых совместно изменять
код то есть вот такие вещи принес нам
гид hop
это позволило многим разработчикам
тысячами миллионов программистов в
допиливать вместе разрабатывать open
source на и проекта с открытым кодом и
каждый программист и в этом мире может
что-нибудь исправить совершенно чужой
библиотеки которые он никакого
практически отношения не имеет
в итоге сейчас есть очень проектов
разрабатываемых сотнями и тысячами
программистов и
об этом несколько лет назад никто особо
и не мечтал что сейчас так будет и
теперь можно спокойно забирать код
любого компонента прямо с гитхаба и
вставлять свой проекции его использовать
не время от времени его обновлять
но чтобы не делать вот это скачивание
кода с гитхаба
и обновление эти всех компонентов
вручную это дело желательно бы
как-нибудь автоматизировать то есть
написать как они консольный скрипт
который бы сам бы скачивал по списку и
обновлял также по списку которую нас
есть при этом решая там конфликты
зависимости библиотек друг от друга и
эти вещи так и придумали пакетный
менеджер composer для печки который
умеет скачивать чужие библиотеки их
обновлять
автоматически прописывать в автозагрузку
и при желании удалять то есть достаточно
теперь выполнить одну консольную команду
для подключения любого пакета и он
автоматически поставится нас проект если
библиотека нам надоело мы вызываем
composer примов и название пакета и это
библиотека удаляется со всеми совсем
мусором который для неё и для ее
существования тоже нужен и такая
автоматизация позволила меньше думать
над скачивание zip-архивов возне с вот
этими вещами и позволяет просто писать
код и программировать уже не отвлекаясь
на это всякую рутину в итоге что нам дал
composer
ну во-первых позволил дал нам
возможность спокойно подключать чужие
библиотеки к нашему пакетом но и помимо
этого
добавил некоторые изменения в умах
программистов которые этот composer
использует он предоставил новую
экосистему и новый подход к разработке
от самобытности и монолитности мы пришли
к автоматизации обмена кодом нашим наши
проектах и если сейчас вы вспомните
если кто-то из вас работал на фреймворке
и версии 10 там 11 то вы помните что
установка чужих библиотек расширение
заключалась в том что нужно зайти на
сайт скачать zip архив распаковать в
папку extension spring видеть авто
загрузчик его и прописать его в конфиг
то сейчас это все дело автоматизировано
комп озером и этого всего делать не
нужно например зачем я буду туда сюда из
одного проекта в другой копипастить один
и тот же код для генерации превьюшек
изображений лучше я уж напишу
какой-нибудь класс который назову
picture manager или как-нибудь
по-другому неважно как его назову и
распакую его загружу его на git хоп и
пропишу его на пока жести на сайте
composer а как пакет вася picture
manager
как-нибудь так его назовем и в
каком-нибудь своих всех проектов которые
мне нужны я просто буду в консоли
вызывать композитора вася picture
manager и этот класс этот пакет меня
поставится наш код соответственно если
один в мире composer если какой-нибудь
программист выложит библиотеку там свой
код extension один расширение x1 второй
программе захочет написать свою
библиотеку x2 и и выложить 3 захочет
написать там не знаю
x3 а 4 программистов другу
сел писать какая-нибудь библиотеку из
вот этих компонентов из 1 x 2 x 3 и
написал библиотеку например лайбрери
один которая использует компоненты у
себя x1 x3
а 4 программист думал думал думал
сидел-сидел сидела и решил написать
целый фреймворк f1 который бы
использовал библиотеку
x2 и точнее библиотеку l1 и какой нибудь
чужой компонент x2 свой сок и хотя здесь
что x что или это одно и то же
практически расширения библиотека
компонент эти
это просто синонимом которыми называются
любой год который можно подключить к
своими проекта который выложил в
открытый доступ в нашем случае и в итоге
каждый пишет только своем то есть этот
человек пишет только код свою фреймворк
а этот пишет только код своей библиотеке
l1 и ему вообще не нужно знать как там
разрабатывается x1 x3 он посмотрел до
библиотека мне нравится и он просто
подключил ее к себе прописал у себя
ссылку на его
а другой программист 3 2 как и раньше
делали они пишут только своей библиотек
и свои компоненты и не заморачиваются
над теми кто их использует их вещи и
таким при таком подходе кто-то написал
хороший лагерь который назвали монолог
монолог и этот лаггер записи
всевозможных блоках так понравился
программистов что они начали
использовать этот лаггер практически во
всех фреймворков которые сейчас есть это
дело из пользователь также кто-то чтобы
не писать свои курву команды для
загрузки чужих сайтов написал библиотеку
вы газу
pitch привезу которая подключается как
называется
как то так на печке
и теперь вместо того чтобы писать к url
запроса вручную там файл get контент и
морочиться с тем чтобы там работала и
аутентификация и прокси-серверы и
отправка всевозможных заголовков чтобы с
этим не мучиться теперь можно спокойно
библиотеку подключить проекту подключить
библиотеку газов и обращаться к чужим
сервером по и пей через вот этот самый
газу и никаких проблем нет
но практически все фреймворке
компонентные распространенное
использовать эти библиотеки исключением
конечно 1 фреймворка который до сих пор
пишет свой лагер который недавно с
велосипеде освоишь дети при клиент чтобы
потому что разломил показался какой-то
не очень удобный библиотекой в общем
смысл в том что можно сэкономить кучу
времени и сил если сообщая использовать
зарекомендовавшие себя чужие компоненты
но при этом есть и обратная сторона
такого подхода компонентного что за
обратная сторона одно дело когда мы
используем чужие библиотеки и ругаемся
на тех разработчиков то они плохо это
написали ли хвалим и и за то что они
написали и хорошо но если мы уже
выкладываем своей библиотеке то такой
подход компонентный и такой социальный
coding накладывает на нас некие
ограничения что желательно уметь писать
такой код который бы другие люди
захотели бы о себе использовать то есть
для этого нужно уже соображать в
архитектуре в подходах компонент настей
и в этих прочих вещах чтобы тому
человеку который будет использовать нашу
библиотеку было не очень сложно
использовать наш компонент
вот в этом мы при изучении этого нашего
микро фреймворка и потренируемся в
использовании во-первых в использование
чужих компонентах а во-вторых написании
своих компонентов так чтобы их можно
было легко использовать другим
программистом и особенно полезно это
будет наша серия скринкастов будет
полезно для и программистов которые
порой не умеют пользоваться не composer
а мне конструкторами классов не
контейнерами внедрения зависимостей не
рекомендации пср не исключениями но
также плохо соображает декомпозиции и
знают не знают многих паттерн в которые
часто используются во многих framework
of
вот так и после того как мы это все дело
и зачем ваша жизнь возможно у некоторых
из вас и жизнь изменится и вы по-другому
будете относиться к фреймворком и
по-другому будете относиться к выбору
этого framework для каждого своего
проекта и уже будете более осознанно
наблюдать за внешним pitch примеров вы
не будете замкнутым только на свою cms
на свой один какой-нибудь конкретный
фреймворка вы уже спокойно можете
использовать совершенно другие
фреймворке
и при этом не будете предлагать очень
много усилий потому что многие вещи у
многих фреймворк ах похоже это что мы
изучим в этой серии скринкастов во
многих местах повторяется так что
начинаем
это пока нам интересно с чего мы обычно
начинаем делать сайт по любой книге
печки для чайников
обычно создание файлы index.php но мы
здесь корни его создавать не будем
потому что здесь у нас будут много
других классов других файлов и поэтому
мы здесь создадим отдельную папку на
который назовем паблик и поместим наш
код мне память файлик индекс спички туда
забабахать какая ведь вот такой который
просто вводят привет всем я здесь и
теперь нам нужно этот файлик как-нибудь
печки выполните открыть его можно
запустить во-первых в консоли
если мы откроем терминал здесь пишем
пички public int .
тоном выйдет страку хеллоу но если здесь
добавим перенос строки пичкал то это
будет виднее он вывел hello- перенес на
новую строку и дальше вводит там все что
нам нужно это в мы выполнили пички
скрипт консоли а нам хотелось бы теперь
выполните тот же скрипт в браузера как
мы будем это делать мы можем поставить
любой пички сервер open server на
виндоусе и полноценный джинкс спички fpm
или apache на линуксе на макинтоше не
сегодня в разной системе
на мы сегодня мы будем пользоваться
встроенным pitch пышным сервером благо
он появился самом письме им и не нужно
ничего особо устанавливать для этого нам
нужно просто выполнить команду еще минус
с вести какой-нибудь адрес localhost
например ось
80 тысяч 80 где там будет айпи адрес или
еще как-нибудь но мы запустим пока так
чтобы он открывался практически по
любому адресу не только палатах росту и
в качестве
[музыка]
так дальше укажем папку с которой мы
будем работать документ руб for public и
соответственно все наши адресации будут
на ссылаться на файл принцип спички
отрываться все будет из него если мы так
сделаем то в какой то момент времени мы
можем спокойно щелкнуть перейти по
адресу вот этому локалхост v8 8080 и
выведем здесь выведется у нас такая
строка хэллоу как и раньше в принципе
код у нас работает в обычные пички файлы
работает все хорошо все успешно и нам бы
хотелось теперь
этот код немного усложнить например что
мы можем здесь сделать
помимо того что мы будем открывать
просто адрес localhost
на который мы сейчас переходим
например если сейчас мы открываем адрес
localhost
вот этот самый то мы открываем попадаем
на этот скрипт как он есть но мы можем
передать помимо открытия самого адреса
мы можем передать туда какими
дополнительные параметры например наше
имя имя вася
или ещё что-нибудь такое соответственно
в самом файлике и дык спички можно
принять этот параметр
именно из параметров без запроса в
данном случае это у нас запрос если мы
просто открываем как они страницу не
отправляем не открываемый пустом влечет
другим ешьте типе методом вы просто
отправляем имя вася и наш код должен от
время получить поэтому мы файлики индекс
печки
делаем вот такую интересную штуку мы
проверяем на eset если установлено
значение переменной name то возвращаем
его
если она там есть если его нет то
возвращаем власть но при этом нужно
учитывать что когда мы какие-нибудь вещи
запрашиваем ед параметрами и пост
параметрами где еще как-нибудь то если
мы здесь ничего не указали то туда
прилетает пустая строка поэтому нужно
сделать проверку не нанесет на и она м
ти не на м2
но мы сейчас не будем заморачиваться
просто передаем имя кололась и он нам
выводит халу вася если мы ими не
передаем нам выводит хэллоуин привет
гость все в принципе хорошо все
нормально хэллоу
работает и соответственно нам можно
посмотреть какие процессы при этом на
сервере происходит
что там браузер наш отправляет что ему
назад прилетает на самом деле браузер
отсылает ешьте тебе запрос на сервер
выполняет пички файл и возвращает ему
http ответ мы можем это протестировать
если
воспользуемся такой штукой спички шторме
как тестированием restful приложение так
авторизацию можно удалить отсюда она нам
не нужна эта штука и мы по адресу
локалхост а вот этому самому 80 тысяч 80
на главную страницу отправляем
какой-нибудь пишите запрос нам оттуда
прилетает flowers
но на самом деле туда прилетает request
с некими полями с некоторыми заголовками
который браузер туда отсылает и оттуда
вылетают
возвращаются нам некие заголовки ответа
то есть реально сервера прилетает вот
эти штуки вот эти строчки и потом
перенос строки и уже там текст хэллоуин
здесь просто пички шторм так их
показывает в разных вкладках на на самом
деле они возвращаются в одной вкладки в
виде одного текста и из чего здесь ответ
в вопрос и ответ складывается если мы
зайдем произведем то же самое
браузере проинспектируем перейдем во
вкладку над work обновим страницу
щёлкнем по
за 2 штуки то мы увидим что мы
отправляем заголовки запросам то есть
сам браузер нам отправляет такой запрос
он нас методом get по такому-то адресу и
отправляет некие гуки
которые здесь установили там сессии все
это стальное . шторм там еще своих скуки
устанавливает это уже его дела и браузер
посылает собственно строку user agent
который показывает из какого браузера мы
пришли из какого браузера откроем он
собственно свое название туда передаст
наш скрипт и соответственно принимающей
стороне на сервере точнее на самом
сервере можно эти данные получить из
этого запроса то есть запрос и ответ
хэллоу вася ответ у нас вот такой пришел
response header именно connection клаус
content type здесь прописан в каком
формате вернулся нам результат дата
какого х 100 и соответственно .
сервер добавляет вот такую строку кем от
1
а влево соответственно мы можем любые
свои заголовки добавлять префиксы x
extended power байтом еще что-нибудь еще
что еще что-нибудь и они соответственно
здесь будут отображаться просто смотреть
на этой за заголовки смысла никакого но
если мы разрабатываем какой-нибудь
мобильный клиент еще что-нибудь такое то
в этих заголовков можно возвращать любую
вспомогательную информацию которая
относится к нашему ответу сервера
но как мы видим пички возвратил нам
такие результаты и мы можем теперь
добавить какой-нибудь вспомогательный
хидр туда как мы это делаем в особо
заморачиваться на этом не будем если вы
читали как ты хоть какую-нибудь книгу по
кличке вы знаете как отправлять архетипе
заголовки если мы добавим вызовем
процедуру header передадим туда x
deventer или sdn и
страницу обновит то соответственно из
сервера нам прилетел такой заголовок
которыми здесь написали
x devil теле после этого контента пустая
строка и response хэллоуин все вроде как
работает все отлично сайт нормально
заработал и соответственно мы теперь
можем писать вспомогательный код который
нам необходим
соответственно любой код который мы
пишем на сервере хоть на pitch приехать
на другом языке программирования
назначения его всего одно это принять
запрос от пользователя извлечь из него
какую-нибудь информацию которая нам
нужно посмотреть по какому адресу
человек пришел с такими параметрами
зачем для чего произвести какие-нибудь
операции и ему вы принять в обратную
ответ сгенерировать ответ хоть
заголовками ходи за не заголовками
просто текста без разницы как и данные
как мы понимаем мы получаем из супер
глобальных массивов на самом деле это
массив не просто один массив get но их
на самом деле
сша это могут быть get пост cookie-файлы
сессия сервер они в печке сделаны
суперглобальными то есть из любого
фрагмента кода из любого метода из
любого класса вообще хоть откуда можно
прямо напрямую использовать эти массивы
и там будут все аргументы которые
прилетели в этом запросе вроде как
удобно на первый взгляд но становится
неудобно когда мы начинаем ими активно
манипулировать нашем поле мы понимаем
текст напечатаем через реку
для заголовку вызываем процедуру header
все вроде как хороша но что если вдруг у
нас нужно сделать фон свой который
называется get лэнг для того чтобы
получить какой-нибудь язык текущей
например если мы вот этот код заменим на
как он берёт такой мы написали функцию
get лэнг которая получает текущий язык
выбранной пользователю как он это дело
делает он смотрит если есть get параметр
link to возвращает его иначе если вы нет
если он пустой и его вообще нет ли он
пустой то потом проверяет покупки сам
если в куках язык установлен то
использует его если не установлен ту
дальше идет проверяет в сессии если даже
с осени установлен то из ешьте теперь
заголовков принимает серверный такой
параметр доступный язык который может
принять у нас сервер точнее наш браузер
который отправляет наш запрос настройках
браузера можно выставить какой вы язык
используйте по умолчанию русский
английский немецкий китайские это далее
так далее и в каждом http заголовки
браузер будет отправлять
серверу какие языки он принимает поэтому
можно автоматически по языку из настроек
браузера
автоматически отдать человеку нужный
язык контента текст на нужном языке это
вполне себе удобно прикольно и многим
нравится
стойки например в итоге мы написали
такая функция которая напрямую работает
с этими суперглобальными массива до
функция удобная но входят в глобальной
переменной и что самое интересное с
другими аргументами и сейчас не вызовешь
чтобы функция была чистая лучше все
данные в неё переднии передавать через
аргументы
то есть сюда передать массив нет можно
даже мути поставить рейд нет и
соответственно сюда принимать этот
использовать этот переданный массив а в
эту функцию передавать вот это значение
и супер глобального массива сразу в
ручной автоматически так на передали get
автоматически аналогично можно передать
и другие параметры cookies и сессия сша
сервер этот битва до лета дарит то есть
код у нас будет примерно вот такой в
результате после вот этих всех
манипуляций мы принимаем все параметры в
этой функцию get cookies action сервер
снаружи ионова нам возвращать нужный
язык
мы можем передать язык по умолчанию
например английский н.а.
если вдруг ничего не сошлось вы ведь в
конце концов английский язык как язык
дефолт соответственно если мы попробуем
этот запрос выполнить то что то у нас
там проблема вышла
аргумент должен быть массивом налоги
иван третий режим знаю какой то массивом
какой массивом что-то мы здесь
накосячили ну ладно так уж и быть ладно
берём фрей запустим на пятницу ладно
известная мы не выполнили себя команду
station старт поэтому сессии у нас не
выполнилось поэтому массив совершенно
пустой
давайте попробуем видимо в этом дело и
не в этом а все вот работает привет
гость твой язык английский потому что по
умолчанию это все дело попробуем
добавить здесь язык лайнах равно ru
русский по умолчанию запускаем твой язык
русский эта птичка шторме
наши аргументы по поливать сюда на самом
деле они так и передается get параметры
а если уберем то все язык станица
английским как и было раньше все вроде
как работает теперь у нас функция чистая
она не лезет никуда наружу и все данные
генерируют на основе тех параметров
которые передали всех аргументов и
теперь сколько бы ее не вызывай с одними
и теми же параметрами она возвращает
один и тот же результат все вроде как
хорошо удобно и при этом мы эту функцию
можем вызывать
из разных частей нашего приложения и не
только для текущего запроса но и
например в тестах передать и любые
произвольные данные прямо вызов там
какой-нибудь фейковый этой фейковой
массив cookies серверов всего остального
и проверить как оно работает без возни с
этими переменами все хорошо но возникает
проблема с тем что за горой таких
массивов работать неудобно и каждый раз
передавать эту пачку таскать их друг
за другом над собой их же много у нас
правильно раз два три 4 5 6 6 штук
постоянного в разные места вписывать не
очень интересно вот чтобы такого не было
можно воспользоваться массивом очень
интересно ну например сделать массив
который назвать request
ассоциативный и в нем передать get это у
нас будет значение из гетто пост с поста
и так далее так далее сам cookies какие
другие у нас будут cookies и дальше
дальше дальше дальше и в это фонд свои
места вот этой горы этих вещей передать
один массив request и соответственно
здесь принимается request
ассоциативный массив и из него
извлекаются все остальные вещи в данном
случае это у нас будет request в нем вот
элемент get или не из него берется
элемент лев все вроде как хорошо если мы
так сделаем то вместо того чтобы эту
пачку поштучно передавать мы их передаем
одним request но с ассоциативными
массивами работать не очень удачно не
очень успешно почему потому что где-то
мы опечатку забудем и где-то у нас авто
подстановка спички шторами не работает в
какой-нибудь другой в редакторе котором
мы пользуется пользуемся поэтому место
массивов удобнее работать с объектами то
есть вместо того чтобы делать
какой-нибудь массив такой мы можем
сделать некий объект
никого класса request который мы будем
создавать request new
request что-нибудь такое
и в этом объекте можно добавить методы
которые будут с этими переменами
работать например get кайри params
который будет брать элементы из
параметров нашего запроса и stories 3 ед
cookies с которой будет брать выводить
текущее cookies и вот этот этой квест
теперь можно передавать в нашу функцию
детлеф
и здесь можно дописать какого типа этот
request у нас будет например того же
типа request который мне здесь оказали
так удобнее почему потому что когда мы
вписан request здесь мы можем у нас
работает авто подстановка мы можем все
что угодно здесь выводить и никаких
опечаток мы не допустим в чем а потому
что автопостановка есть если мы
единичным перепутали печки шторм или
другой какой-то редактор сразу
показывать что мы допустили ошибку что
такого метода нет в объекте все вроде
как хорошо и когда мы сделали такой
request жить стало немного проще потому
что вместо пир поштучной передачи этих
всех вещей всю информацию о запросе
можно кинуть поместить в один и тот же
объект и передавать этот объект в git
long моего передали в какое-нибудь
другое место тоже можно также его
передавать это мы записали его прямо
здесь но мы здесь так мудрить не будем
этот файл
загромождать различным кодом вместо
этого мы вынесем его в отдельную папку
потому что какой смысл ему хранить прямо
здесь для этого мы так как мы пишем
фрэнк создадим папку для всех классов
всех файлов нашего проекта например
создадим папку сердце sources для
исходников ней создадим папку framework
именно framework они прямо в сердца
писать потому что здесь у нас может быть
другая папка которой она будет
называться об или еще как-нибудь где мы
будем писать код нашего приложения
который будет использовать наш прибор
вот мы папку сделали framework и в ней
можно сделать под попку по директорию
которую назвать http и туда поместить
наш класс почему ешьте типе потому что в
этой папке шти типе у нас будут
находиться все классы которые как-то
связаны с request вам response of
cookies там сессии и что-нибудь такое
то есть все что связано с ответами и
забросами самого сервера и так если мы
поместили туда наш класс request
соответственно нужно нам теперь этот
request принудить
прикрутить мы можем вот таким путем
указать папку для файла который мы хотим
будем подключать если мы находимся в
папке паблика нам нужно подключить класс
из папке src которая выше находится
начинается выше публика
то нужно пойти сначала на один уровень
вверх потом на сердце это до лета дали у
нас нет никакого авто загрузчиком не все
файлы должны подключать вот так о ручная
все наши классы если мы будем их
использовать в принципе место вот этой .
можно вызвать здесь der name чтобы
подняться на один уровень вверх и вот
эти . отсюда убрать все в принципе
понятно но такая запись смотрится не
очень интересно если мы будем так и
копипастить в принципе можно объявить
какая-нибудь переменная верху куда
поместить эту текущую папку и точнее
константу объявить и потом эту константу
использовать но можно пойти другим путем
можно выполнить функцию hdr и спешную
процедуру которая сменит текущую рабочую
папку если мы так сделаем то у нас
текущая директория поднимется наверх на
один уровень будет качестве текущей
использоваться корневая и соответственно
теперь можно все рекламе писать по
относительным адресом относительно корня
в котором мы сейчас находимся
если мы этой штукой поднялись на уровень
вверх корневую папку то теперь можем
серег вера писать от корневой папке и
больше никаких констанции никаких der
name абдиров здесь не использовать это
приятнее и удобнее если вдруг в каком
другом месте в ходе у нас появится
необходимость какой-нибудь зеркала и
разделать там и этот рик флэр прямо так
сделаем где-нибудь тоже по
относительному адресу нам не нужно
заморачиваться над тем чтобы из папки 6
теперь понятно фреймворк потом и сердце
потом в корневую и потом куда не
допустить поэтому так мы решим делать
адресации таким путем соответственно его
request переместили вот тот код который
у нас был
но мы здесь делали немного это делаем по
другому методы назвали по другому если
этот кто-то был кэрри params то в этот
метод мы назвали назовем парсит будем и
который будет возить возвращать отсюда
либо пост если я в нем что-нибудь есть
либо новый если там что-нибудь нет
почему мы назвали метод get парсит body
они get например пост парус в принципе
можно было бы назвать пост params и
канон вы возвращала просто пост но тогда
при этом нужно понимать что запросу у
нас бывает не только get и post но
бывает еще другие get пост под плач
делить давайте сюда их напишем еще есть
header общем
и можно придумывать свои собственные
если нам таких стандартными устраивать и
при этом вот эти все нижние 4 штуки
пост почти лет могут приходить с пост
параметрами если мы что то какой форму
отправляем через метод post она попадает
в супер глобальный массив пост но если
мы отправляем у тпа чадили ты что-нибудь
такое другое то они у нас тоже
могут попасть в поста могут не попасть и
при этом могут быть там совершенно
разные зависимости от того еще в каком
формате мы отправляем данные но если бы
ориентироваться на эти методы чтобы нам
пришлось бы сделать лет пост params
потом get out params патч params это до
лета до лета дали это не очень удобно
почему потому что методов может быть
сколько угодно и придется каждый метод
по новых писать вместо этого мы бы могли
в нашем коде который у нас имеется
использовать всего два метода в этот
класс поместить для обработки всех вот
этих четырех нижних
первый метод который возвращает название
этого метода он нам вернет put пост патч
удалит это далее то дали и будет у нас
метод get body который будет возвращать
те данные которые мы туда передали
которые к нам пришли
но мы вместо метода get body назвали
этот метод get парсит воде почему мы так
его назвали потому что если мы
отправляем какую форму пост запросам из
http формы из html формы то у нас
прилетает именно массив пост в качестве
этих вещей то это мина массив но у нас
может быть не все данные приходить из
формы если запрос приходит формате json
или xml то он нам попадает именно как
строка некое место которое называется hp
envy
соответственно если мы хотим получить
оригинальную строку которая к нам
прилетела то мы бы могли добавить метод
get body
который читал бы вроде как файл такой
псевдо файл псевдо такой особый поток
птички input сюда прилетает вся
информация которую мы передали метод
прост велит очень пост патч еще что-нить
еще что то есть вся информация прилетать
сюда
но помимо этого метода get будем мы
могли добавить метод get porn года в
которой потом уже расспрашивать
результат
то есть там уже применять функции джон
ди кателли simple xml от string или еще
как-нибудь ещё как-нибудь соответственно
если в get блоге у нас прилетел xml в
качестве в виде текста то метод get
парсит body должен нам вернуть массив
построены из этого xml или как-нибудь
еще или если нам прилетело числом tomoya
делаем синдикат вызываем функцию и она
нам возвращает массив с теми данными
которые нам чувство не прилетели вот так
мы поэтому назвали метод отдельно
сделали get парсит body который
отличается от оригинального метода body
который возвращает нам сырые данные
которые к нам прилетели
так поэтому оставим это дело таким путем
если она мне какие данные вообще не
прилетели то парсинга диномир если нам
прилетели
данные из формы пока если мы здесь
работаем только с методами get и post
можем оставить это дело таким путем
ладно оставим пока так просто мы вынесли
request в отдельный класс и написали
индекс спички который использует этот
request дает объекты потом из этого
объекта получает параметр name и выводит
хеллоу
не который у нас и был обновляем
страницу хэллоу оси у нас такой
выводиться значит ничего у нас не
сломалась и рекламе у нас такой работой
пойдем дальше классу у нас будет много
писать их увидеть поштучно по очереди мы
их не будем поэтому нужно сделать
какой-нибудь организовать автозагрузку
простейшим путем мы можем автозагрузку
произвести с помощью composer а и чаще
всего автозагрузка с помощью него и
работает если мы у себя создадим в корне
проекта файлик composers он такой по
каком повезло куда ли он пока не нужен
то
в composers он чаще всего мы пользуемся
секции рик в нашей системе и всех зовет
и секции рек мира но можно указать какие
библиотеки нашем проекте будут
использоваться и какие версии самого
языка php и о расширении соответственно
если мы хотим использовать спички 71 то
мы здесь можно написать такую вещь и
если кто-нибудь попробует установить наш
проект на компьютер где
версия печки меньше the composer числом
the composer будет на него ругаться что
у вас требование системной несовместимо
с тем которые здесь нужно это что
касается секса и рекорд здесь можно
указать сам печки его различные
расширения например пички intel здесь
указать какой версии нам определенные
нужны это далее так далее ну и дальше
здесь можно через запятую указывать
другие библиотеки нужных версий которые
нам нужны но помимо этого мы можем
добавить отдельную секцию назвать
конфеты для красоты указать
composer у сортировать вот эти
содержимое рик мер по имени
если мы такое не делаем то каждый новый
библиотек он будет добавлять в конец
этого списка а если сорт покажет
поставим то он будет их каждый раз
пересортировать
алфавиту это красиво удобно и сразу
видно что к чему относится если мы от
одного человека три разных пакета
установили то о фамилии этого человека
эти все три пакета будут идти вместе они
разбросаны по всему списку и так если мы
сейчас выполним команду composer install
the он у нас это дело установит давайте
выполним composer что сделал он у нас
создал
папку vendor куда поместил ники autolot
свой собственный сгенерированной и здесь
у нас файликом поселок в котором
содержится текущей версии there пакетов
который нам нужно данном случае здесь
написано что требование платформе
остальные вещи по капусты и потому что
мы ничего не добавляли и
что еще можно сюда добавить какие
элементы здесь можно установить пакет
который называется ров security advisor
покажу как это такой псевдо can пакет
который можно теперь включить командой
нарекла р-ров security от мира и его
подключить версии div мастер если вы
работаете на печке штормит apeach к
шторам вам подскажет подключить этот
пакет своего проекта если вы с ними
работаете то вам будет такой единый
совет его подключать если вы его у себе
поставить это что он будет у себя делать
такую операцию он выполнит он сюда
пропишется в бриклаер в секцию composer
его вроде как установят и впали composer
лак в пропишет здесь вот такой список
конфликтов с которыми будет у вас этот
проект ваш текущий конфликтовать и этот
пакет что делает он просто содержит
список тех компонентов у которых найдены
серьезные уязвимости безопасности то
есть старые версии какие-нибудь там
побитые взломанные еще что не такое где
были большие проблемы поэтому если вы
установите такой пакет и вдруг
какой-нибудь у вас другой пакет нечаянно
подтянет эти вещи то композер начнет
ругаться что какая-то версия какой-то
библиотеки конфликтует с вашими текущими
установками с вашими настройками и все у
вас в принципе будет хорошо такая
дополнительная защита от нечаянного
скачивания старых версий опасных версий
библиотек ну и собственно мы конфиг
прописывали река
это сделали инициализировали такими
начальными вещами указали версии пички
установили пакет безопасности и теперь
нам нужно прописать
сделать автозагрузку для того чтобы наш
файл
request composer загружал
но если мы сейчас попробуем открыть наш
вот так что у нас есть ли как спичка
арик вас здесь есть то нам нужно сделать
некую
попробуем вот этот самый composer enter
the lot загрузить composer оба
и таким путём что из него нам нужно
подключать только файлик autolot он
будет отключать все классы автоматически
но если мы сейчас попробуем это сделать
у нас то получаем что класс про яркости
тигры квест не найден почему потому что
composer работает с простым добавлением
100 просто загрузчика работает именно
своей
внутри своей папке vendor то есть для
всех библиотек которые установились над
ранее
если бы мы чужие поставили чтобы они
погружались наношу не подгружаются
почему потому что про нашу папку и
сердце он ещё не знает и снаружи наружу
папку vendor он выйти особо сейчас не
может чтобы он узнал про нашу папку
чтобы знал откуда наши файлы загружать
мы должны воспользоваться указать ему
эту папку для этого как используется
особая секция composers он и который
называется autolot так как мы используем
стандарт именования классов besar 4 это
значит что у нас получилось так что
название namespace и имени класса
совпадает с названием директории и имени
файлом поэтому искать здесь особо ничего
не нужно если мы так и будем на миновать
наши классы раскладывать такие папки
которые будут совпадать с именами
навесов то никаких проблем не будет но с
таким наименованием и соответственно мы
должны ему указать наш autolog сделать
секцию autolot в нее по тексту весов 4
потому что в класс у нас так найдены и в
этой секции ему указать что все классы
которые начинаются с namespace a
framework самого верха нужно искать
папке src фреймворк соус из фреймворк и
когда мы вот эту штуку показали новый
авто вот здесь прописали нам нужно здесь
прописать новую команду который будет у
нас
называться компрессором по 2
так мы проделали что написали вот так
dump of the lord
написал что сгенерировал autolot files и
если мы посмотрим в папку vendor
composer of the ladies are 4 то он здесь
закодировал виде массива именно ту папку
которыми указали вот этот namespace если
мы теперь обновим нашу страницу
то все класс у нас погружается все
работает это загрузчик загрузился это на
тот случай если кто-то из вас с этим
вещам не работал и об этом не знает
потому что
и программисты место этой стройной вещи
пользуется фреймворков skin of the
загрузчиком с псевдонимом там нужно
указать сет элис бэкон frontend команд
консоли
потом не забыть их еще в тестах указать
в разных местах и если мы забудем то у
нас класса не находится непонятно что
происходит по такой встроенный штука как
секций autolot самого composer а там
никто использовать не умеет на других
фреймворка с этим все
приятнее потому что там другие фигурки и
все-таки используют и framework не очень
с этим дорожек поэтому когда мы это дело
здесь писали
так я пока usb-дисков сбоку сделаем и
добавлю авто логин который у нас есть
все мы поладим записали теперь можем
дальше программировать наш код добавлять
разные request и наши классы не будут
нормально у нас отображаться в системе
так для новичков ликбез по composer в
автозагрузке prequest вам прошел теперь
серьезные вещи которых вы хотели сегодня
изучить итак у нас совершилось такое
деяние что мы написали свой некий код у
нас появился первый класс нашей системе
request и его желательно было бы
как-нибудь протестировать на это класс
примитивное тестировать его особо нечем
но если у вас сложные появится то без
тестов кто-то
чтобы будет грустно если вы их не
протестировать я нужно установить просто
печкою нет как это делать вы открываете
консоль выполните команду composer
рекордов . . юнит и он у нас
прописывается composer слон и мы должны
соответственно после этого сделать некие
операции если мы это сделаем ананас
пропишется скачается папку vendor все
будет хорошо и нам нужно потом добавить
папку тест куда мы будем собирать писать
наши тесты и добавить в электричке юнит
xml действовать вот так почему этот файл
называется спичка индексом l dist
петтисом пички юнит устроен так что он
считывать сначала просто файл пичкает
xml если он есть давайте скопируем .
если у вас два файла то он будет читать
вот этот пичкает xml если у вас этого
файла нет то он попробует прочитать xml
диск искать если он нашелся то возьмет
его и мы можем себе wicked игнор
прописать этот файлик пичкает xml а у
себя его в проект не включать потому что
если вдруг какой-нибудь программе
захочет изменить настройки тестирования
то он может его потом создать свой
собственный и таким собственным перебить
глобальные настройки которые были у нас
это очень удобно а что у нас спички and
xml откуда взять да откройте на гитхабе
какой-нибудь проект которого есть тест
на печке юнит оттуда скопировать его
содержание и он будет вас примерно такие
что настройки bootstrap нужно указать
ему какой файл будет у нас запускаться
перед запуском всех тестов при открытие
печки юнита мы соответственно подключаем
текущей автозаправщик
если у вас в системе пички unit
используются они встроены который у нас
установился в папку vendor или ещё
куда-нибудь
сейчас себя composer им стал выполню
чтобы он у меня поставился так вот папку
vendor
раз паковался печки и нет сам и куча
пакетов которые ему нужны нам не
пришлось их вручную здесь устанавливать
и соответственно папки vendor бен
оказался файлик запускающийся winder бен
пичкают
который мы запускаем отсюда но мы можем
печкою нет в нашу систему установите
глобально если мы не просто пишем
камбузе reliquary composer global рик
war
если мы будем запускать тот глобальной
из той папке то он особо не поймет как
нашу папку vendor
отсюда сюда подключить но для таких
случаях ему нужно оказать чтобы он наш
авто загрузчика мина подключил чтобы
наши классы потом находил они откуда-то
из глобального место запускался без
наших файлах и дальше нужно указать ему
из какой папки в каких папках у нас
находится тесты и какой у нас белый
список потом можно поставить белла
список для того чтобы делать например
анализ покрытие тестами кода из какой
папки по белому списку должно нас класса
искаться из какой не должны
если мы так сделаем если мы такое не
сделаем и будем анализ покрытие кода
производить тоннам всю папку vendor
засосет и потом покажет какие файлы из
папки вендор наше тесто затронули
выполнялись наших тестах но это сейчас
не интересно так теперь нам после того
как мы это все сделали нужно написать на
тест для нашего request
как он может выглядеть а выглядеть он
может вот примерно таким у нас будет
например test framework рис с тест и так
тест у нас можно выглядеть вот так
примерно пешим класс request с который
наследует спички infraworks кейс и что
он будет проверять сначала он
в пустыми это мы потом создает объект
request мы создаем и проверяем что метод
кори params возвращает пустой массив
метода сирт нала возвращает точнее
парсит бодя возвращает пустоту ну все в
принципе хорошо не если мы но какие не
других тестах укажем что get у нас
должен быть в переменную глобальную get
присвоим такой массе в тома и должны
проверить что из кайри params
возвращается в тот же самый массив
который мы туда присвоили
парсит body в этом случае пустой из вот
этого request а если и дальше напишем
тесто якунин для портит будем попробуем
сначала в 1 и попробуем запустить его
вызовом вендор бен и шпионит вот у нас
все зеленая 1 . это значит один тест у
нас работал все хорошо
добавляем 2 тест сетку или params вот
этот например попробуем с двумя тростями
как он работает все хорошо работает и в
принципе должно вы нас быть еще здесь 3
test который проверяет метод парсинга
который у нас возвращает результат пост
запросом post мы присвоили такой массив
создаем request и должны запустить
потоки у нас к вере params в данном
случае должен вернуть пустой результат
up our feet будет должен вернуть эти
данные которые мы туда присвоили в пост
вроде итак запускаем тест видим что у
нас что то не то
а почему у нас нет а получаем ошибку
из-за чего просто все тесты у нас
запускаются один за другим в цикле
а массивы эти у нас суперглобальная это
значит что если мы какой-нибудь этот
массив заполнили в одном методе то и тот
же массив мы можем прочитать в другом
методе он будет тот же самый с теми же с
вами данными то есть получается что вот
эти данные у нас должно быть там пустота
но вместо get твари params вернулись вот
эти результаты из другого теста приз по
сути вот эти данные вот этот волокита
вернулись на вот здесь в другом тесте
а не сбросились вот как раз получили
проблемы что мусор из второго теста
мешает третьему тесту поэтому мы должны
в каждом тесте обнулять все остальные
параметры чтобы они нам не мешали то
есть дед мы присвоили пост поставили
пустой потом третьем тесте head мы
должны опустошить сначала чтобы вот эти
перри затереть на новые попробуем
запустить заново
теперь теста у нас проходит все зеленое
все хорошо вроде как метода get кури
парам спарсить body работает так и каких
наше до
ожидаются но они в принципе все вроде
как хорошо но мы можем вот эту
инициализацию гетов и постав чтобы
каждый раз их не писать get possession
сервер это далее то до лета дали чтобы
каждый раз не обнулять вместо этого мы
можем вынести это в отдельный метод
который будем вызывать перед каждым
тестом в пичкаете достаточно
переопределить метод сетап стандартной
печки юнитов ский который запускается
перед каждым тестом и здесь обнулить эти
переменные и тогда обновление ним нужно
делать теперь в каждом тесте здесь мы
просто запускаем здесь мы просто
заполняем guest здесь мы заполняем пост
потому что эти у нас уже нулевые
запускаем теперь заново все у нас хорошо
все запускается так мы забыли то что у
нас должно работать сервер запустили его
теперь пойдем смотреть как у нас все
нормально до сих пор работает сервер все
отлично сайт работает все запускается но
нам пока не устраивать такие длинные
команды которые здесь имеются у нас
системе
их придется куда-нибудь копировать ридми
что нужно каждый раз зайти сюда и
запустить вот эту команду или теста
запускать из папки вендор венгрии
хотя для тестов это удобно понятно туда
запускать но вот эту серверную не особо
интересно и сейчас изучим как раз изучим
новую фишку которую вторую фишку которые
не знают многие программисты это то что
файле composer час он помимо
секции рег файл и авто лада нужно делать
еще и использовать и другие секции здесь
можно у себя
подключать и сейчас нам нужно обратить
внимание что писию нет у нас запустился
в секции рекорде
почему потому что тесто в основном нам
нужны только для разработки но не нужны
для рабочего сайтов продакшне поэтому
если мы устанавливаем период наша
система то его лучше установить флагом
рик вердес это значит что они попадут
сюда всех церквах где
что это значит более так глобально это
то что если когда мы вызываем команду
install на каком-нибудь сервере то он у
нас
устанавливает все вещи которые имеются и
в рекламе это квартир но если мы на
рабочем сервере
устанавливаем наш сайт то можно
установить флага многих без
девелоперских вещей и тогда он это все
дело удалит и
на продакшене у вас остановит сайт
только и все зависимости только и секции
рекламе и не будет погружать или квартет
соответственно если вы install
делать без флага надев то он у нас до
установят все вот эти разработчики и
зависимости спички юнит как мы видим он
вернул обратно сейчас про индексируется
эта папка чтобы они там заново появились
все появились
теста у нас заново вернулись на место
какое секция мы сейчас будем
использовать а мы будем использовать у
себя секцию скрипт
и мы можем взять вон те две команды
которые там были у нас здесь делать
секцию скриппс и сюда добавить две
команды surf и тест сюда скопировать
одну сюда скопировать другое и теперь
вот это же все дела которые мы запускаем
вот такой длины команда место этого
можем спокойно запускать composer
и название этой командой surf так один
что-то у нас не то пошло .
видимо у нас там уже работал или нет да
адрес используется поэтому он
остановился у нас aware старта поэтому
надо его найти и удалить это мы делаем
ищем команду
смотрим какой процесс то missed процесс
номером 30 545 дела дней давайте удалим
этот процесс бьем kill kill
у нас 930 5455 45 пробуем запустить
buzzer серых все сервер у нас запустился
хорошо что мы сделали мы в нашей системе
удалили пички процесс который занимал
этот порт 80 тысяч 80 дней он у нас
заново заработал все хорошо умели о
через диспетчер задач и так сказать
это работает и запуск тестов
потренируемся composer тест до
запустился тест работает но нам теперь
не нужно помнить какие у нас команды
откуда запускается какими параметрами и
то до лета до лета дали если мы здесь
просто укажем шпионят то по умолчанию у
нас не будет выводить цвета все работает
черно-белом но нужно здесь фиксировать
вывод цветов через color орды стадо
ложности то появится все зеленым
загорелось это специфика работы скриптов
в этом озере
поэтому делаем так цветами сюда
добавляем еще хорошо и когда мы отправим
открываем любые наши страницы то теперь
во второй вкладке у нас сервер должен их
уже вроде как обрабатывать и показывать
что мы там пооткрывали
peach фиксер запустим все хорошо итак
поехали дальше мы добавили script and
composer и теперь прием следующей части
вернемся к нашим тестом
как мы уже заметили нужно нам постоянно
помнить что методы объекта request вот
теперь пора спарсить будем сидеть и
остальные обращаются
возвращает данные не самого объекта а из
внешних системных массивов которыми
здесь обновляем и присваиваем если мы
создадим два объекта request один
request 2 здесь например 1 и 2
то хоть request один хоть request 2
будет у нас возвращать один и тот же
результат почему потому что оба они
обращаются глобального массива get
считывают из него данные от этого пока
никуда не денется и если мы в
какой-нибудь метод request один liquid
e2 в какой-нибудь объект добавим сеттер
с помощью которого мы можем изменять эти
данные то если мы у request один
выполним какой-нибудь
изменение то это изменение затронет и
результат вызова request 2
арсен body рекой баром и то есть
неудобства глобальных переменных и
синглтон of когда мы их использован
своим годен то есть во-первых нельзя
создать два объекта с разными данными с
разными наборами данными то здесь
практически невозможно и во-вторых к
нечайно и изменение чего-нибудь в одном
месте приводят к изменениям и ошибкам
другом месте которые мы не особо сможем
уследить и тестировать это дело крайне
неудобно потому что нужно постоянно
помнить что откуда взялось и как решить
эту проблему и откуда она появилась
просто мы сначала абы как написали наш
код какой то первое попавшееся а потом
попробовали его протестировать и
налетели на невозможность на трудности
его тестирования если бы но если бы мы
сначала подумали как мы будем
использовать объекта в тестах
то проблем с этим не было то есть место
такой штуки как мы request
создаем и вот этикет и заполняем снаружи
мы бы могли сделать request некий куда
передавать разные создавать request вот
таким путем мы создавая мы создаем его и
в конструктор передаем массив
а метров диеты массив аргументов с поста
то есть по сути у нас здесь выглядело бы
вызов в создании request a таким путем
мы делаем не request так request 1 равно
не request и передаем в него get
параметры которые нужны а когда мы
делаем 2 request что мы передаем другое
имя бонд например еще что такое с
возрастом 16 это у нас будет 2 и
соответственно у первого и второго
результаты уже будут совершенно разные у
этого будет и не джон у этого бонд и они
друг другом вообще никак не будут
пересекаться и в этом случае нам вообще
не нужны будут вот эти супер и
глобальной массивы переменные с которыми
мы общаемся и глобальные константы и
тогда бы вообще не пришлось думать
помнить о том куда у нас эти методы
лезут зачем они нам нужны и что нужно не
забыть чтобы все работало и в нормальном
ходе в тестах
вот давайте исправим ситуации так и
сделаем чтобы мы могли в request
передавать первым параметром get a
вторым параметром данные для просто
которые нам нужно как-нибудь вот так и
чтобы эти тесты продолжили работать как
и раньше и все это было благополучно и в
таком случае нам можно вообще убрать вот
этот метод сетапы и вообще забыть про
обед после все это стальная мы будем
просто заполнять чисто объекта и чистого
объектов вызывать методы которые им
нужны так и реализуем в себя в коде
в тесто у нас упростятся мы туда будем
передавать данные напрямую виде массива
и соответственно в request можно
добавить конструктор который будет
принимать эти параметры присваивать
приватные переменные приватные поля и из
этих меток айри парам спросить будет
отдела
возвращать вне в нетронутом виде и
изменим соответственно файлик public со
индекс печки так чтобы он вот эти get и
post тоже передавал в этот конструктор
класса объекта request и все теперь у
нас получилось так что вот эти get и
post
остается у нас работа с ними только
внутри файла индекс пички нигде в другом
месте нашем коде они не используются то
есть класс риск квест стал теперь
абсолютно универсальным его можно
использовать везде
хоть для обработки своего запросов и для
обработки каких-нибудь чужих для
эмуляции чего-нибудь выполнение в тестах
и тогда да и тому подобно стало намного
удобнее и приятнее но наличие заполнение
этого объекта через конструктор и
отсутствие каких нибудь сеттеров делает
его изменяем то есть эти данные у него
доступны для чтения но если в процессе
работы сайта
index.php вот этого файла нашего здесь в
зависимости от какой-нибудь ситуации
нужно будет как-нибудь изменить наши
элементы например сектор если там будет
центр сет парсит будем если мы хотим при
квесте поменять что-то если мы добавим
этот сектор
то мы можем в этой ситуации производить
вот такие операции и за request он
который нас имеется получать значение
kit body
если например мы проверим что content
type прилетел именно формата json
там и о себе сделаем вот так возьмем
оригинальной сырой
результат из запроса виде строки
его прогоним через функцию джонс decode
syndicate и он нам вернет массив который
мы запустим заполним в поле арсен воде
чтобы у нас парсинг бодя возвращал
теперь полноценный массив уже из вот
этой строке сделаны соответственно если
запрос у нас оказался xml то мы вызываем
функцию simple to xml от string куда
передаем то же самое и у нас request
заполняется данными виде массива
старшинова из xml а вот чтобы такое нас
получилось нужно добавить вот такие
секторы сад парсит buddies were params
это далее так далее чтобы можно было их
изменять вот давайте их у себя сделаем
но сектор и мы можем называть как угодно
давайте назовем их и через set
а через бис то есть помимо метод get
кури params мы сделаем метод который
назовем discovery params но можно
назвать его сетку ри params без разницы
как что с такими-то данными что
установить какие-то данные это
переводится на русский практически
одинаково
ну разница большая есть надо разница
дойдем скоро на скором времени так
сектор и мы добавили и теперь в
index.php но заодно мы убрали например
отсюда конструктор потому что нам сейчас
он в принципе можно его было оставить
чтобы можно было некоторые данной
заполнять через конструктор некоторые
данные за заполнять уже потом через
сеттер и так сказать через мутаторы то
есть методы которые изменяют что-то
внутри объекта называют ему татарами
чаще такое бывает и
нужно изменить файл index.php чтобы он
создавал request пока пустой и поштучно
заполняла его все поля входными данными
которые к нам прилетели можно заполнить
его таким путем нового можно например
переделать вот таким другим образом
чтобы можно было заполнять его
последовательно цепочкой не request
сделать потом у него сделать с какими-то
параметрами и с такими параметрами
или вот так заполнять видеть
чтобы добавить такой цепной интерфейс
нужно просто из каждого метода вернуть
самого себя этот объект чтобы потом к
результату который вылетел у нас и завис
корей params применить другой
какой-нибудь даров метод безопасен body
надо ли это делать и легко
мы просто идем в класс request
из каждого метода просто делаем мир и
черный зыс чтобы он вернул сам себя
теперь можем именно цепочкой избавить
вот так добавили это дело ну когда мы в
какой-нибудь объект добавляем сеттеры
ники так сказать мутаторы который
изменяет в него в нем какие-то данные то
может это дело у нас привести к
некоторым ситуациям не очень хорошим
которую нас могут встретиться проектом
что имеется ввиду под такими ситуациями
то что изменения в одном в каком виде
объекте могут сломать другие объекты
какой-то момент времени например если у
нас есть также функция get long как и
раньше куда мы request передавали им и
например создали у себя некий request 1
и потом на основе этого ли квестор один
взяли его скопировали в request 2 такой
и потому request 2 заменили параметры
язык внутреннего линкору оставили и
теперь мы попробовали наши мир функцию
гитлер вызвать от двух этот request of
the request 1 и 3 quest 2 и вместо того
чтобы 1 вернул от request один
оригинальное по умолчанию значения n у
нас оба возвращает руб почему так
происходит потому что в
объектно-ориентированном
программировании происходит
такая ситуация что при сколько угодно мы
какой-нибудь объект будем присваивать
новым переменам то есть по сути из
переменных переменной присваивается
только указателя у нас копируется только
указатель объект в памяти будет один и
тот же в итоге обе переменные и request
a request 2 1 2 ведут на один и тот же
объект если мы меняем request 2 то по
сути меняется request один потому что
это она один в нашей системе
чтобы такого не было нужно сделать
написать здесь конструкцию клон которая
именно создать копию объектом второй
объект и только в таком случае первый
объект возвращать значение по умолчанию
н а второй объект будет возвращать уже
измененное значение line хоро
в методе aged к варе params вот такие
проблемы из-за непонимания работы lp как
он хранит в памяти то что он объекты не
копирует когда мы из одной переменной
другую изменяем нужно это дело помнить
потому что объекта в отличие от
примитивов работают если бы мы работали
просто с числами или строками если в
один происходит значение 5 туда
присвоили а потом в request 2 например
написали значение 7 то тогда бы у нас
размещалась в 1 5 2 7
они поменялись в.п. так по умолчанию не
работает нужно обязательно клонировать
чтобы избежать ошибок но чтобы этих
ошибок избегали абсолютно все и чтобы
они ни у кого не возникали никогда в
жизни можно сделать так чтобы внутри
методы вскоре пола params происходил вот
этот клон каждый раз и чтобы вот этот
метод говори парам создавал клона
объекта и присваивал его
и возвращал его то есть если мы у
request
один вызовем метод вискарь и params the
request один у нас должен никак не
измениться а вместо этого должен по
родится второй объект новый его
клонированная копия у которых будет уже
проставлены язык русский соответственно
request a dinner ps2 в данном случае
будут разными объектами вот такие
объекты с такими
вещами называют называют имут обильными
то есть они не меняются внутри то есть
они как один раз создались так и
остаются такими любой вызов любого
мутаторы любого сектора из них на самом
деле не никак не изменяет исходный
объект а вместо него порождает его клон
то есть мы здесь можем спланировать
себя в новый объект у нового объекта
изменить значение кори params не
обращайте внимание особо что мы здесь
изменяем приватную переменную из другого
объекта нож в объект на реке данных
языках так можно то есть приватной
переменной доступной при работе внутри
класса ходит со своим объектом зевс хоть
другим объектам то есть если у нас сюда
прилетит какой нибудь еще один request
козырь то мы также можем обратиться к
этому новому объекту о заговоре params
его присвоить хоть пули приватная но мы
из другого объекта можем имеем к нему
доступа потому что он находится
это объект такого же класса которым мы
сейчас находимся
поэтому сам собой тоже умеет работать то
есть по сути мы воспользовались вот этим
лайфхаком спланировали объект поменяли
значение вернули этот объект не теперь а
когда мы вызываем букет new request
потом вискарь и парам спасен будет у нас
получается что здесь создался request
один этот метод из него породила request
2 и дальше когда моя дергаем дальше по
нашей цепочки то вот этот метод бар
сегодня возвращает у нас новый объект a
request три то есть по сути место одного
объекта который меняется у нас сейчас
такая ситуация чтобы порождается
последовательно три новых объектов с
небольшими изменениями из предыдущего на
основе предыдущего да и то с этим
некоторые люди могут поспорить которые
очень радеют за быстродействия своего
кода но нужно понимать что в памяти у
объекта храниться только название класса
и значения его полей если у нас там и
land круто это всего лишь плюс название
просто объект занимает максимум там сто
кило 100 байт если там строка из ста
букв то это с тобой поэтому хоть в
миллион таких объектов на делаете это
будет всего 100 мегабайт если у вас
смена ready mid на сервере 128 мегабайт
то все эти миллион объектов туда влезут
и в печке 7 и объекты строятся не
медленнее чем обычно с татьяной массива
так что что вы с массивами работаете их
копируете друг друга что вы объекта
новое создаете это разница между ними
практически никакой
вы не заметите тех мили или микросекунд
который на этот дело тратятся поэтому не
переживайте насчет того что мы порождаем
три объекта место 1 итак теста у нас
теперь немного тоже изменится потому что
мы из request a по цепочке также будем
это дело делать запускать new request
создаем потом wisp арсен будете и
запускаем наш тест а вот теста проходит
значит всего нас работает нормально и
так пойдем дальше что у нас здесь еще
есть вот здесь мы используем только get
и post но на самом деле там могут быть
еще сессия сервер cookies не может быть
ещё что-нибудь еще что вы уже придумаете
сами каждый раз в каждый проект этот код
копипастить не особо интересно поэтому
его можно вынести в какой-нибудь
статический метод который будет
заполнять вот это все дело само по себе
то есть можно создать
статический метод close request fat
которые статическим методом from global
который будет делать то же самое что мы
сюда указали и если мы передали сюда к
вере или будет а заполнится и если не
передали то по умолчанию возьмется из
супер глобальных массивах from глобус
как мы здесь указали и все теперь она в
каждом новом проекте которые будем
делать на этом фреймворке достаточно
написать одну строку вот эту из
нормальной жизни
вот мы это сделали в то есть по сути
класс request у нас готов вместо того
чтобы работать с глобальными массивами
мы сделали удобный объект в котором
поместили всю информацию которую
помещаем всю информацию
пользовательского запросе вот как то так
и теперь нам нужно перейти к тому что
сервер у нас должен вернуть какой-то
ответ как мы уже сказали сервер
принимает запрос что-то там считает и
возвращает ответ ответ из чего она
состоит как мы и сказали из некого
текста и из некоторых заголовков вашти
тебе особо больше ничего нет все
делается через такие вещи вот мы и за
request захватили имя формировали строку
ее вернули
и добавили к ней заголовок что
разработчик сейчас еле сдает этого
проекта этого фреймворка так сделали и
так как у нас задача в приложении
принять запрос и вернуть ответ то в
случае если бы мы не работали с какими
такими объектами
а делали просто с массивами чтобы у нас
было вот такая ситуация мы бы заплатили
какой-нибудь request
потом у нашего приложения выполнили бы
если бы был у нас класс апликэйшен какой
нибудь объекта
об выполнили бы у него метод humble
request и он бы нам на основе вот этого
массива request вернул бы на массив
response внутри которого были бы чтобы
бы хранилось внутри него внутри бы него
было текст в этом hello- например уезд
оттуда бы вернулся этот текст и оттуда
повернулись заголовки который мы оттуда
прислали например ключ вот так а это
значение девелопер а его значение вот
такой бизнес вот если бы мы работали с
массивами мы бы из программирование нашу
систему так что request у нас вернулся и
точнее это был бы у нас response в таком
виде туда бы вернулся из метода handle a
request и теперь мы бы могли и этот
рывку он с как нибудь вывести в нашей
системе то есть сначала вынести все
хедиры вернуть циклом пройти по response
header сам и потом распечатать response
body которой оттуда прилетел с вашим
текстом
вот с массивами был бы работали так нос
бы был массив входных параметров request
и оттуда бы возвращался из какого-нибудь
контроллер или щетку массив выходных
параметров с респон сам с текстом и с
заголовками которые туда прилетели от по
сути примитивная вещь которая там может
быть системе и его вот этот response
тоже можно сделать объектом на основе
того же самого request a который мы
сделали для request а то есть мы
если мы будем делать response для нашей
системы то можем на него написать
какой-нибудь тест где придумать как у
нас response будет работать
ну и например пока лишнее уберем
например если по умолчанию мы создадим
объект response передавая туда строку
какое-нибудь то она попадает у нас
вводим этого response а то есть если у
него будет метод get бодик который будет
возвращать строку которую передали то
они должны у нас совпадать передан из
треков приняты и по умолчанию если мы
никакой код не указали то оттуда должна
возвращаться статус код 200 то есть у
нас тут теста с services по умолчанию
возвращается сервера http 10 200 ok
это именно код ответа которые там есть
соответственно если мы передали туда 200
то оттуда ничего туда не передали тот
туда код должен вернуться 200 помолчали
если мы пойдем на какой-нибудь страницу
который не существует то оттуда у нас
пока все страницы ведут на
index.php мы так сделали при запуске
сервера поэтому он не можем здесь
показать но если мы хотим вернуть
сообщение что страница не найдена или
еще как-нибудь мы можем передать до
статуса 404 и тогда статус должен
двинуться 404 а в ответе здесь должен
быть 404 not found
то есть нужно откуда-то брать вот эту
строку чтобы ее в результате выводить
нашей системе
поэтому здесь можно помимо метода get
status code добавить метод get рязан
фраза которая будет именно возвращать
текст окей дыры 200 и какой-нибудь
другой текст для других например если мы
в response передали код статуса 404 то
она должна вернуть строка not found
и дальше мы можем сделать так чтобы в
response мы могли добавлять хедиры
такими же самыми ему татарами мы сделали
сделаем response тоже и мутабельным
объектом который будет порождать новые
объект вместо
изменение старого что мы можем создать
response к нему добавить первый
заголовок второй заголовок с именем
значением и проверить что метод гид
headers из этого response и вернет вот
этот массив вес на имя один будет равно
значение 1 а имя 2 будет равно значение
на во что там два заголовка и
соответственно когда мы будем этот
response использовать о себе в яндекс .
мы будем делать в принципе тоже самое мы
создаем новый response туда передаем
хеллоу и стали хэллоу вася и добавляем
наш заголовок
без федор степи header x deventer или
сдаем и дальше уже вызываем выводим вот
эту строку
который мы здесь узнали 200 ok вызывая в
код возвращая
и строку которые к этому коду
соответствует и дальше пойдем по массиву
headers of и их выведем функции хидан
как мы и раньше делали и потом после
этого распечатаем response гид body
который оттуда вернулся то есть мы
теперь при таком подходе полностью
сделаем весь цикл и жизни нашего
приложения мы взяли все данные запроса
их как-то обработали
они построили формировали ответ и этот
ответ отправили пользователя но при
таком подходе
чем он отличается от предыдущего когда
там был просто эко
мы вот этот вещь можем и здесь
пользователи не отправлять а можем
куда-нибудь реализовать сохранить
поместить куда ни в кэш или отправить по
почте без разницы куда
когда мои отправку ответов вынести ли
отдельно от его формирования то мы можем
вместо отправки пользователю его
отправить куда угодно например здесь
обернуть его в какой-нибудь xml обернуть
его в час он и отправить совсем
по-другому по отдельному адресу или сюда
добавить еще другие заголовки которые
нам нужны будут наши системе так и как у
нас примерно будет этот response объекта
выглядеть который удовлетворяет этим
вещам а будет выглядит нас примерно вот
так в конструктор мы передаем текст и
статус он по умолчанию присваивают
приватные переменные
get таргет body with body либо
возвращать текст либо клонирует объект
меняя текста нового спланировано
возвращает статус возвращает фразу и
здесь мы можем добавить массив с разными
по умолчанию которые будем возвращать
туда то есть если резьб фраза для этого
объекта не определено той мы ее
заполняем значением по умолчанию из
массива и возвращаем жилье ему that we
статус мы можем сделать так чтобы он
принимал две вещи и код сообщение и
фразу not found in response еще что
такое мы можем менять о самостоятельно
ну и добавили методы для работы с
хейтерами get headers получает массив из
вейдер проверяет есть такое или нет
получает конкретный лидер по имени
заголовок и хедер
подменяет в конкретный заголовок на
новое значение которые сюда передадим и
когда мы вот такой request a response на
основе
квеста сделали то можем спокойно
использовать его себя
индекс печкой попробуем тест проходит
или нет до сих пор проходит все хорошо
все работает а response работать и dark
в итоге мы сделали
и request или spawns request для того
чтобы хранить все данные запроса и
request чтобы в нем возвращать все
данные нашего ответа из нашего
приложения это мы реализовали теперь
попробуем по программировать что-то
более полезное
а именно попробуем сделать так можно ли
этим request a response am теперь
поделиться другими вещами как например
делиться теперь разными наработками с
разными программистами
но например что имеется например если у
нас есть какой-нибудь класс след тот же
самый лечить детектор в который содержит
ту самую функцию get land который мы
здесь используя
и мы как этот класс используем мы
создаем этот детектор
потом вызываемый него метод get ленгвич
передавая туда наш request который мы
сделали если мы свой di questo здесь
реализовали request равно не request
наш собственный фреймворк http request
из нашего пространства имен и создали
свой ланч детектор который принимает наш
собственный фреймворк http request
этот же класс и потом уже из него
дергает значение из гетто поста
там кукисов сессии сервера и тоннеля
падали падали то есть то что написали
раньше при таком подходе этим классом in
which детектор мы не можем не с кем
поделиться вообще и он никому кроме нас
не нужен потому что ни у кого не
заработает почему потому что у других
программистов класса request другие то
есть если у нас собственный май request
to другого программиста в другом и во
фреймворке будет его собственной его
request и он спрограммировать его
совершенно по-другому не так как мы и мы
соответственно
получили проблемы от этого кода что мы
не можем делать кодом поделиться с вами
но мы можем для лучшей типизации
придумать для универсализма
этого всего дела они могут этого май он
request нас нашей библиотеке мой
собственный request
вместо него реализовать ставить некий
интерфейс который назвать request
интерфейс например ну или сервер request
интерфейс почему мы вместо request
интерфейс используем серверы квест
интерфейс данном случае потому что
запрос запросу рознь если мы отправляем
какие-нибудь данные спички через куру на
другой сервер и спички-то это у нас
исходящий запрос какому-нибудь сервису
соответственно если мы request назовем
то соответственно мы можем вести
интерфейс для исходящих запросов кому то
что они содержат могут содержать
сообщение параметры адрес и заголовки
которыми отправляем на хедиры
это остальное другое дело когда мы
сейчас рассматриваем наш файл индекс
спички сейчас мы в этом request on не
отправляем куда-нибудь в другое место
гарантийный запрос а это запрос который
к нам прилетел от сервера и содержит
даже серверные параметры сессию все это
остальное то есть это у нас
откуда-то от пользователя к нам на
сервер прилетел
некий отдельный запрос мы можем его
назвать сервер prequest
который для которого можем сделать
обозначения интерфейс отдельный вести
серверы квест интерфейс и который помимо
тех данных которые содержатся в обычном
request интерфейсе
он будет еще содержать плюс глобальную
переменную точнее глобальный массив
сервер и глобальный массив сессия вот
как то так
в этом его не будет здесь у нас будут
только get и post параметра вверх а
внешне будут у нас сервере сессии
поэтому мы для удобства чтобы не путать
разные концепции можем сделать интерфейс
назвать сервере квест и вот этот наш
объект который мы используем request
назвать именно сервер request on
чтобы понимать что это не исходящий
запрос куда-то
обходящий request к нам от сервера от
самого печки который из браузера
прилетел и обработался бич пишет
интерпретатором но когда мы сделаем вот
этот самый наш сендер request интерфейс
он у нас будет свой интерфейс и мы
скажем человеку что от нашего интерфейса
на 6 мы ждем от него методом и в каире
params и парсит body например вот эти к
первым 2 штуки в принципе могут быть и
все остальные это нас видит каким
образом это будет у нас так это будет у
нас такой который возвращает себя если
мы такой интерфейс определим то теперь
любой программист может под наш
интерфейс написать собственный класс
который будет его реализовать и если мы
своим свой request используем напрямую
то этот человек может использовать свой
request к нам например написать свой
request адаптер который его собственный
лора беловский или симфонический request
будет его собственный
другой озеро request будет приводить к
нашему видом которые реализуют наш
интерфейс не то есть через вот такой
адаптер можно скрестить чужой request с
нашим интерфейсам который мы вели
и вот тогда нашим детектором мы можем
поделиться с другим человеком потому что
ему не придется реализовывать наш класс
request и он может использовать свой
собственный класс request но просто так
не мода писав адаптер некий конвертер
который его преобразует под наш
интерфейс и все вроде как будет хорошо
[музыка]
теперь мы можем спокойно делиться и если
теперь несколько программистов друг с
другом договорятся использовать один и
тот же интерфейс вот этот общий
какой-нибудь камон в своих фреймворков
то есть напишут что если мы будем ну
напишем свой собственный вот этот самый
линович детектор который будет
использовать какой-нибудь общий
интерфейс до которых договорились
несколько человек одновременно кто все
эти люди все 100 или 1000 человек
которые договорились могут теперь
использовать у себя вот этот общий
интерфейс который можно вынести вообще
на покажет определенно хип-хоп вообще
просто один интерфейс и все
каждый будет подключать его к своему
проекту и свой
и писать под него свои адаптеры и тогда
уже нашу библиотеку ленгвич детектор уже
могут этот компонент используют другие
люди своих framework и могут делиться
своим кодом которые они пишут теперь под
вот этот интерфейс и например под
интерфейс свой response интерфейс
который мы ведем если подумать еще
дальше то можно сделать вообще вообще
полностью абсолютно общий интерфейс для
всего мира для всех response of request
of во всем мире peach пышно но
оказывается такое же сделана группой
пички фиг
и называется такая штука рекомендация
пресса rsi
которая содержит внутри себе именно
набор вот этих интерфейсов серверы di
queste простой request
response интерфейс messages интерфейс
общее от которого не оба наследовать
сайта далее так далее и тому подобное и
чтобы теперь подключить его к нашему
коду нам достаточно выполнить команду
composer рикулло рпс or пишите теперь
нанесу
именно под таким пакетом они спрятаны и
их достаточно установить свой код но
перед тем как их устанавливать мы должны
посмотреть как мы вообще будем вот этот
сам собственный сервер request интерфейс
реализовывать ну как мы это делаем
заходим наш класс request берем копируем
отсюда все наши методы и
их спокойно выносим в интерфейс и
сервере квест интерфейс например вот
такой с методами кит кайри params весь к
вере парамджит парсинга девиз парсов
боли и response интерфейс методами дед
мой девиз бодяги статус кол отрезан
фраза стала туз кедр и что-нибудь
основное когда мы сделали свой
собственный интерфейс framework of happy
to любой программист как мы уже сказали
может написать к нему адаптер написать
свой любой класс котором добавить эти
методы и как можно сказали если мы
подключим командой composer эквайер пср
архетипы место что мы вместо этих
интерфейсов можем использовать
стандартные федоровские которые очень
похожи на те которые мы сейчас придумали
вот как раз мы называли свои классы свои
методы
именно по тому как они реализованы в
интерфейсе как назван если мы теперь
перепишем
так composer install не забудем
выполнить чтобы он подтянул антессер и
включались то мы теперь можем вместо
стандартных наших собственных
использовать псы русские испанцы
интерфейсы и русский сервер request
интерфейс что они себе представляют ведь
тоже самый сервер request интерфейс он
наследуется от его же request интерфейс
за исключением того что у себя добавляет
серый params и cookies params которых
при отправке кому-то другому восходящих
запросов нет в request интерфейсе
соответственно серых параметров нет и
ничего такого нет и для response а
сделан отдельный там response интерфейс
теми же самыми кодами свет статус клод
методами get статус гидре за фраза и со
всеми остальными her body это далее так
далее но они здесь не перечислены почему
потому что они вынесены в общий
интерфейс который называется 6-ти psh
интерфейс здесь будет и протокол версия
заголовки fedora
и метод будет боди и висбаден
то есть по сути и у request a response а
есть body & a request a response и есть
заголовки поэтому они здесь вынесены в
отдельный интерфейс от которого
наследоваться оба и request интерфейса
response и сервер request
поэтому мы теперь можем спокойно
использовать и в своем коде достаточно
просто переключите льна я имплементацию
их и добавить все методы которые им
нужны
да здесь уже есть куча методов
если мы период адониса посмотрим какие
методы еще нужны нашему этому интерфейса
то увидим что печки программиста в
данном случае очень постарались когда
гласа вылезайте методы эти методы много
пока не используем в своем коде
хотя were квесте мы даже rigidbody на
используем мы используем get парсит
будем там написали свои собственные
реализации но в чем различие
этого интерфейса от того который мы у
себя использовали различие несколько по
сути получается теперь то что хедиры
вместо того чтобы один заголовок под
одним названием записать здесь
поддерживает именно запись массивах
нескольких значений внутри одного хедира
то есть помимо того что здесь есть метод
весь headers
диван там есть таким загар так виски
дервиз еды вот с таким http заголовка
есть header не и вылью помимо этого
имеется метод который называется видит
header с помощью которого мы еще можем
под этим же самым названием добавить еще
несколько значений то есть по сути они
внутри стали
будут храниться именно массивами
соответственно нужно переделать немного
наш код который с этим заголовками
работал метод битка вейдер свернет не
просто имеет значения а имя и несколько
значений их нужно склеить например через
запятую или вывести как-нибудь
последовательно друг за другом
еще одним вложено фары чем вызывают от
федора без замены
заголовка 2 на друга что еще изменилось
a response а в этот методе невест боде и
еду один используется не просто строка
туда передается а некий объект который
реализует стрим интерфейс которой есть
метод tostring
и основной метод в него называется get
контент с помощью которого можно его
содержимое получить но помимо этого
имеются методы рейд в рай и кривляется
чтобы можно его было перемотать на любую
позицию чтобы скачать часть файла это
дали гадали для чего этого нужно но если
нужно сервера вернуть файлы размером в
500 мегабайт то как то странно его будет
здесь сначала прочитать в response of
body загнать все эти 500 мегабайт а
потом через реку вывести это не очень
хорошо вместо этого можно написать некие
есть объект в которой будет открывать
файл и page точно там с нибудь цикле
читать постепенно через функцию ифрит
новую и новую новую строку и выводить
так построчно итератором как-нибудь так
то есть по сути работа со стримами с
потоками намного универсальнее чем
работа просто со строками потому что
потоки могут быть абсолютно любыми мы
можем написать сколько угодно разных
классов который будут реализовывать
поток хоть со строкой хоть с файлом хоть
ещё откуда-то может даже с одного
сервера брать даже можно сделать прокси
сервер который будет заново серый
рассчитывать и передавать то что он
только что считал так поштучно работать
в цикле поэтому с
со стримом работать более интересным и
мы у себя можем для этого интерфейса
стрим интерфейса можно написать
классники string стрим в котором будем
передавать нашу строку с контентом и
реализовать другие методы хит контент
еду string в основном которой нам нужны
для возврата из этой строки
но и метод get says который возвращает
результат размер нашего контента строка
попадает в приводной перми но я туда
берется
и остальные методы мы не используем
нашей системе пока не нам не нужны и в
наших тестах в response of may вместо
того чтобы сразу сравнивать загид будете
первым сравнивать bodied контент или
вместо этого можно приводить к строке
написать здесь string rigidbody и тогда
сработает метод с тремя который
называется the string который вернет тот
же самый контент который мы здесь
написали то есть разницы никакой хоть мы
и будем dicked контент вызываем хоть мы
и в кастрюльку это дело приводит это мы
сделали и теперь смотрим что еще нам
нужно как мы уже сказали интерфейсе
испанцы риск в 106 теперь вот этого
очень много методов которые мы не
реализовали request а вот такие то есть
достаточно реализовать эту этот
десяток-другой сотни методов и у нас
будет полноценный код совместимость с r
zar интерфейсами всего лишь но мы это
делать не будем потому что
нужно ли это делать и неужели никто
этого не делал до нас оказывается уже
написали люди варианты класса request
response стрим эти и всего подобного для
реализации вот этих общепринятых
интерфейсов и этот пакет называется зэнт
директор с от zend framework и нам
достаточно подключить к нашему проекту
через composer эквайер zend framework
зодиака раз некий пакет и он у нас
установит в нашу систему свою реализацию
этих интерфейсов то есть собственный
request и собственный response то есть
что у нас будет выполнен в composer
декор зодиак тарас сейчас иногда
установит нам до установил сейчас
импортировать будет или нет значит он
уже там уже была установлена доримов
сделаем потом уже кто и раздевание
заново
все считал и мы вместо своего
собственного
объекта response будем использовать уже
директорский объект html a response для
того чтобы туда передавать наш текст то
есть по сути в библиотеке
если зайдем нее zend framework сын
директора и сердце
то увидим что здесь есть класс для
класса request
есть классах response и есть уже некие
стримы уже готовы для response а то есть
здесь у нас будет дополнительно еще
наследники классы html response сон
response and response и redirect
response а то до лета далее тому
подобное то есть по сути можно
использовать нестандартный базовый класс
response отсюда а любой из его наследник
html текстовый чосона в скире
директорский или пустой то есть чем они
отличаются от вот этого response а если
здесь содержится вся базовая информация
того что имел response в конструкторе
автоматически добавляется content type
именно html страницы текст html сон
response и аналогично добавляется
то есть мы сюда передаем html-код он
создается здесь будет если мы будем
использовать в сон response to он в
конструкторе автоматически дополняет
метод 35 сон и здесь использует вызывает
метод encode который что он перегонять в
таком то есть все это вставлена
внутреннего так теперь что мы можем
сделать с этими вещами когда мы респуб
панцире квест подключили теперь мы тоже
применяем наши файлы по
public индекс спички и
используем ешьте теперь response место
нашего испанца который был раньше то
есть здесь мы полностью перешли на
замдиректора наш в года остальное как
было у нас какое так и осталась почему
потому что он у нас реализует тот же
самый при серовский сервер request
сервер использует интерфейс request
интерфейса серверы в понс интерфейс и
помимо этого у него есть такая же
фабрика которой мы придумали сервере
крест factory с методом у вас цифрам
глобус но он в отличие от нашего
заполняет уже всеми параметрами гетами
файл сами серверами тестами cookies сами
постами то есть абсолютно всем выпечки и
нку там тем же самым
это далее то до обеда далее то есть в
нем полностью реализован этот весь код
который нам был нужен не теперь после
того как мы перешли на эти элементы нам
можно полностью удалить наши попытки
реализовать классы request респон стрим
это до лета дали то есть как мы видим у
нас пропала папка framework почему
потому что у нас не осталось класса
который мы там можно хранить
потому что мы полностью перешли на
директорские и в тестах мы полностью
перешли на директорский попробуем
запустить тест тест вот у нас теста
проходит но у нас поменялся немного те
классы которые мы используем интерфейс у
нас тот же самый поэтому тесты на мне
вообще не нужно переписывать ника как
они были какими такими и остались и
соответствие нет смысла писать тесты
дополнительный для чужих библиотек чужих
классов поэтому мы можем наши тесты
собственные для request a response а
удалить request и response тест которые
нам теперь нужны удаляем перекрест с и
удаляем response тест и они их тут быть
уже не нужно и что у нас осталось из
кода еще не переделана это то что у нам
пока бросается в глаза вот это простая
низкоуровневого кода который пишет все
заголовки и рисует ответ когда мы не
будем делать несколько разных проектов
по одному тому
фреймворки лучше этот код тоже вынести
также как мы фабрику вынесли в отдельный
метод то и вот этот код по отправке
можно вынести в отдельные объекты в
отдельный метод это реализуем это мы
реализуем просто вырежем этот код отсюда
и сделаем отдельный объект куда
котка месте так нашей папке src создадим
объект рис класс response sender в
котором будет methods and который будет
принимать любой пассажирский response
типа response интерфейс который надпись
ждите писем и он будет делать то же
самое отправлять главный заголовок со
статусом именно остальные заголовки и
печатать сообщение наносить который
будет к трону там образовалась
инок спички и миндак спички мы создаем
этот response синдер и вызываем метод
цен куда передаем to the response но на
самом деле когда мы с вами установили
zend сельскую библиотеку этот самый цен
директор сто на самом деле там уже есть
такой же объект который называется сопи
emitter который занимается тем же самым
делом то есть мы можем теперь полностью
удалить наши дисконт-центр мы будем
использовать за периметр и его метод
имеет в который делает принципе то же
самое он реализует emitter интерфейс и
содержит методы которые отправляют
статус отправляет заголовки и отправляет
body
сообщение этого через и методе который
выводит сообщение из боди самого нашего
ответа который мы здесь вывезли
соответственно и в так как из буде
возвращается у нас 100 мной находится
стрим которого есть метод tostring
магический которые здесь выводится когда
мы вызываем метод эко
точнее конструкцию т.к. она все вещи
которые передали пытается конвертировать
строку
тогда срабатывает метод tostring
который выводит именно этот результат
именно браузер но помимо этого сопи
эмиттера там еще есть другая реализация
которая называется сопи стрим emitter
более продвинутая она уже в отличие от
того простейшего отправки сообщения
здесь выводит интересную вещь что она
как раз когда при вызове имеет будем как
раз проходит перематывает это будет на
самый верх этот поток самое начало файла
если бы этот поток был таким и пока у
нас это будет не закончилась пока там
файл не закрылся или еще с ними такое не
произошло она считывает из нашего стрима
только маленький фрагмент и печатаю вот
того через реку
соответственно если здесь воде у испанца
окажется поток который внутри себя
открывает файл и считывает его по
чуть-чуть то при вызове вот этого метода
рид и именно вот этот результат
максимальная длина буфера например 8
килобайт будет считываться из этого
файла печатают со строками по 8 килобайт
отравляться браузер и тогда уже никаких
проблем с выводом результата у нас не
будет
но при этом это же вещь еще и позволяет
если were спаси и есть некий заголовок
который называется контент range который
мы и за request и можем передать или еще
откуда из другого места то это позволяет
нам реализовывать докачку файлов если
там какой-нибудь большой файл скачивали
потом браузер пытается его
докачать снова остаток то тогда уже эта
штука перри мотается на те байта которые
мы за передали на тот на ту позицию и
пойдет скачиваться дальше то есть для
более такой продвинутой отправки
сообщения где если вы планируете
использовать файловые потоки или
что-нибудь в этом духе то лучше
использовать сопи стрим emitter вместо
стандартного сопи эмиттера дома и
используем пока стандартный потому что
мы ни каких то стримов не открываем
ничего не используем и вполне себе
можем организовывать наш код таким путем
и так в итоге итоге что мы изучили
на этом уроке с вами во-первых мы начали
с понятия как наш php и другие серверы
обрабатывать запросы соответственно из
браузера туда приходит запрос и оттуда
сервер должен вернуть ответ обработать
этот запрос построить какие-то строки
обработкой информации записать базу
данных считать оттуда и вернуть ответ мы
начали с работы
суперглобальными с массивами которые
используются спичкой по умолчанию get
past station сервер cookies и другие и
потом чтобы не возиться
отдельно с этими массивами мы
сконструировали некий объект request
которые содержат все эти массивы внутри
себя то есть содержит всю информацию о
пользователе
запросе все его заголовки все его
cookies и все его данные все что только
от него пролетела дальше мы пишем любой
свой код который что-то выполняет
формируют какие-нибудь строки и
этот код должен нам сформировать объект
response именно с ответом который
содержит всю информацию об ответе
он содержит тело сообщения некий текст
или какой-нибудь открытый файл или
ссылку на какой-нибудь другой ресурс
поток и может добавлять сюда любые
заголовки и через заголовки могут
устанавливать некие cookies какие нужно
вернуть
браузеру и после этого мы используем
любой отправляли щик этого сообщения и
вызываем метод имеет и как в случае с
методом и мид так и в случае с нашим
собственным собственной реализации
сендера который мы сделали у себя в
папке src
response центр такой вот именно такой
класс response and
если вдруг понадобится мы можем
переместить поделиться с другим
человеком почему потому что они вот этот
класс не зависит ни от зельде actors не
использовать вообще никакие вещи не наши
собственные класс и другие не с нами
другое он использует общей мировой
интерфейс тср и теперь на ситуацию
интерфейс также он может принимать
использовать любой метод
сервер request интерфейс любой тип или
просто request интерфейс если вдруг нам
захотелось
какого-нибудь разнообразие мы хотели
сделать набор инструментов по управлению
этими request вины и респон сами
соответственно от реализации своих
request of response of мы отказались и
перешли к общепризнанным общемировым
которое используется в печке именно по
спецификации пср 7 точнее это не
спецификация рекомендации от группы
пички фев которые разрабатывают возможны
и такие
некоторые свои внутренние собственные
рекомендательные вещи
кто-то их называет стандартными кто-то
не называют стандартами но это просто
если вы хотите выйти в глобальный мир
программирование на печке то вам лучше
придерживаться этих
общепринятых правил вместо того чтобы
делать каждый раз что-то своем
велосипеде потом другим объяснять как с
вашим кодом работать и мы помимо этого
разобрали с вами как подключать теста
как использовать теста для наших классов
которые у нас есть и сегодня
познакомились очень хорошо с файлом
composers он из каких set состоит мы
использовали не только секции рик флэр
игры вает дев но и секцию autolot чтобы
прописать чтобы наши классы загружались
из наших папок то есть все классы
которые начинаются с нами space a
framework у нас загрузились из этой
папке все классы начинающиеся с теста
грузились из этой и сегодня мы научились
пользоваться скриптами
composer и то есть мы можем объявить
диссекцию скрипт потом объявить ники
псевдонимы для каких-нибудь команд и
собственно сюда вписать наша команда
которые нам нужны и потом эти же скрипты
по этим псевдонимом вызывать как
composer surf для composer тест в нашей
системе и если
перейдем на нашу страницу то увидим что
до сих пор наш сайт работает выводит
хэллоу квест не там если вы думаете что
там это старый кот за кашира вался
давайте поменяем на место добавим три
восклицательных знака обновим страницу
вот они три ! а значит вот наш работает
и хоть мы перешли несколько раз пытались
переходить к разным вещам он у нас
остался вполне себе рабочим и вполне
себе остался оказался стандартизировано
почему потому что мы
переключились на удобные уже готовые
чужие библиотеки на этом все
следующий раз с вами от такого страшного
кода которая освободит только холоп west
bay перейдем к реализации полноценных
контроллеров и чтобы по разным адресам
нашего сайта
открывали выводились разные тексты
открывались разные страницы и чтобы они
принимали разные параметры и посмотрим
как этот самый request
и этот response как в эти контроллеры
про бросит нашли квест и как оттуда
получить наш response и как сделать
систему маршрутизации чтобы она понимала
по какому адресу какой контроллер должен
открываться а на этом на сегодня все до
скорой встречи

Комментарии:

Нет комментариев.