Создание фреймворка. Класс Router

Создание фреймворка на php с нуля (20.02.2020)

Здравствуйте, уважаемые студенты!

Вам необходимо создать фреймворк на php с нуля, некий каркас для будущего приложения. Благодаря фреймворку при написании веб-приложения разработчик избавлен от необходимости решать такие задачи как маршрутизация, подключение к базе данных, безопасность и т. п. Кроме того фреймворки предлагают множество дополнительных библиотек кода, таких как библиотека для работы с электронной почтой. В качестве руководства для выполнения работы предлагаю плейлист.

Содержание работы

Вам предстоит создать начальную структуру фреймворка, класс Router, который будет отвечать за маршрутизацию во фреймворке. Далее реализовать функцию автозагрузки и передачу параметров в действия контроллеров. После реализуете компоненты модели, а также необходимый класс для работы с базой данных. Вы познакомитесь с мощной ORM библиотекой RedBeanPHP, которая предоставляет готовый набор методов для работы с БД. И многое другое .

Требования к отчёту

1.Построить диаграмму классов используя UML

2.Построить диаграмму последовательности

3.Листинг программы с комментариями

Отчёт-по-интернет-программированию.pdf Отчёт не полный. В нём пока отсутствует диаграмма классов и диаграмма последовательности

Веб-фреймворки: введение для новичков

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

Что такое веб-фреймворк

Веб-фреймворк — инструмент, облегчающий процесс написания и запуска веб-приложения. Вам не нужно самостоятельно писать кучу кода и тратить время на поиск потенциальных просчётов и ошибок.

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

Типы веб-фреймворков

У фреймворков есть две основные функции: работа на серверной стороне (бэкенд) и работа на клиентской стороне (фронтенд).

Фронтенд-фреймворки связаны с внешней частью приложения. Простыми словами, они отвечают за внешний вид приложения. Бэкенд отвечает за внутренне устройство приложения. Рассмотрим оба типа поподробнее.

Серверные фреймворки. Правила и архитектура таких фреймворков не даёт возможности создать веб-приложение с богатым интерфейсом. Они ограничены в своей функциональности, однако вы всё равно можете создавать простые страницы и разные формы. Также они могут формировать выходные данные и отвечать за безопасность в случае атак. Всё это определённо может упростить процесс разработки. Серверные фреймворки в основном отвечают за отдельные, но критически важные части приложения, без которых оно не сможет нормально работать. Вот несколько самых популярных фреймворков и языки, с которыми они работают:

  • Django — Python;
  • Zend — PHP;
  • Express.js — JavaScript;
  • Ruby on Rails — Ruby.

Клиентские фреймворки. В отличие от серверных, клиентские фреймворки никак не связаны с логикой приложения. Этот тип фреймворков работает в браузере. С их помощью можно улучшить и внедрить новые пользовательские интерфейсы. Фронтенд-фреймворки позволяют создавать разные анимации и одностраничные приложения. Все клиентские фреймворки отличаются по функциональности и использованию. Вот некоторые из них:

Все эти фреймворки используют JavaScript.

Многофункциональные фреймворки. Meteor известен как фулл-стек веб-фреймворк. Это значит, что он удовлетворяет почти все потребности как со стороны клиента, так и со стороны сервера, что делает Meteor чрезвычайно популярным. Вам не нужно тратить время на то, чтобы наладить взаимодействие между двумя фреймворками через REST API — вы можете просто выбрать Meteor и ускорить процесс разработки. Но это не главная особенность этого фреймворка. Обе стороны — серверная и клиентская — работают на одном языке, поэтому вы можете создавать и использовать для них один и тот же код. Следующая особенность — «режим реального времени» — когда вы что-то меняете в одном интерфейсе, изменения происходят и в остальных. В качестве примера можно взять документ или таблицу с общим доступом. Когда вы добавляете комментарии или как-то изменяете содержимое, другие пользователи тоже это видят.

8–9 ноября, Москва, 12 600–151 200 ₽

На этом о разделении на типы можно закончить, однако масштабы тоже важны. Фреймворки также отличаются по размеру. Существуют такие монструозные фреймворки, которые предлагают решения для всех задач.

Более легковесные варианты специализируются на решении конкретных задач — такие фреймворки называются микрофреймворками. Они не предоставляют «из коробки» всё, что нужно, однако иногда лучше разложить функциональность на несколько подоходов (фреймворки, микрофреймворки, библиотеки). Функциональность микрофреймворков можно расширять с помощью сторонних приложений и создавать небольшие проекты на их основе или совместить микрофреймворк с основным «большим» фреймворком.

Например, если ваше приложение основано на Django и вам нужны веб-сокеты, то вы можете воспользоваться микрофреймворком aiohttp.

Другой пример: если ваше приложение не очень большое и вам нужна только простая маршрутизация URL и шаблоны с несложным контекстом, вы можете использовать Flask с Jinja2 (или другим шаблонизатором) вместо Django.

Особенности и архитектура

Несмотря на то, что все фреймворки отличаются друг от друга и выбрать какой-нибудь из них может быть очень сложно, есть несколько вещей, общих для них всех. Речь идёт об архитектуре и особенностях, которые так же важны, как и функции.

Архитектура

Архитектура почти всех фреймворков основана на декомпозиции нескольких отдельных слоёв (приложения, модули и т.д.), что означает, что вы можете расширять функциональность исходя из своих потребностей и использовать изменённую версию вместе с кодом фреймворка или использовать сторонние приложения. Такая гибкость является ещё одним ключевым преимуществом фреймворков. Существует множество open-source сообществ и коммерческих организаций, которые создают приложения или расширения для популярных фреймворков, например, Django REST Framework, ng-bootstrap и т.д.

MVC — Модель, Представление и Контроллер (Model-View-Controller) — три составляющих каждого веб-фреймворка.

Модель содержит все данные и уровни бизнес-логики, её правила и функции.

Представление отвечает за визуальное отображение данных, например, диаграммы, графики и т.д.

Контроллер просто трансформирует данные для команд предыдущих двух составляющих.

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

Особенности

Теперь давайте посмотрим на некоторые общие особенности, которые делают фреймворки многофункциональными и удобными на практике.

Веб-кэширование

Кэширование просто помогает хранить разные документы и позволяет избежать надоедливой перегрузки сервера. Пользователи могут использовать его в разных системах при определённых условиях. Также оно работает на серверной стороне. Например, вы могли заметить кэшированные веб-страницы на странице результатов поисковой выдачи Google.

Скаффолдинг

Это ещё одна технология, поддерживаемая некоторыми MVC-фреймворками, о которой следует знать. Фреймворк может автоматически сгенерировать типичные части приложения или даже всю струкутру проекта (если речь идёт о инициализации). Это позволяет существенно увеличить скорость разработки и стандартизирует кодовую базу.

Система веб-шаблонов

Система веб-шаблонов представляет собой набор разных методологий и программного обеспечения, реализованных для создания и развёртывания веб-страниц. Для обработки веб-шаблонов используются шаблонизаторы. Они являются инструментом фреймворка, отвечающим за веб-публикацию.

Сопоставление URL

Если вы хотите упростить индексацию вашего сайта поисковыми движками, в то же время создавая привлекательное название для сайта, то эта функция фреймворков — то, что вам нужно. Также сопоставление URL может облегчить доступ к страницам вашего сайта.

Приложения

Множество типов веб-приложений поддерживаются веб-фреймворками. В основном они применяются для создания таких приложений, как блоги, форумы, CMS и т.д.

Вся эта функциональность свойственна всем фреймворкам. Однако, как ни парадоксально, с таким широким ассортиментом разработчик теряется и не может ничего выбрать. Поэтому вам нужно придумать критерии, согласно которым можно выбрать лучший инструмент, облегчающий разработку. Например, ваш выбор может зависеть от предпочитаемого языка программирования. Как было упомянуто ранее, фреймворки можно найти на всех языках. Кроме того, нужно обратить внимание на круг возможностей набора инструментов фреймворка. Если он покрывает ваши потребности, то вы на верном пути. Говоря о предпочтениях, стоит отметить, что они могут служить как во благо, так и во вред. Конечно, лучше использовать фреймворки, которые проще изучить, однако порой написанные по правилам старой школы и редко используемые, но подходящие фреймворки, могут привести вас к успеху.

Руководства

Как мы уже убедились, выбор и использование веб-фреймворка может стать тем ещё испытанием. Однако сам процесс не такой уж и сложный, как могло показаться. Есть достаточное количество документов, библиотек и руководств, призванных помочь изучить фреймворк и ответить на все возникающие вопросы. Существуют сайты, которые предоставляют быстрое введение в любой фреймворк.

Например, Tutorialspoint — кладезь разных руководств, покрывающих структуру каждого фрейморка и предоставляющих информацию по разным деталям. Есть руководства по Java-фреймворкам, PHP-фреймворкам и Zend.

Если ваш выбор пал на Ruby on Rails, можете заглянуть в это подробное руководство, которое описывает все «за» и «против» этого фреймворка и учит всему необходимому, начиная с установки.

Безусловно, это далеко не самый полный список. Интернет полон разных источников, из которых можно черпать новые знания. Вы можете посмотреть пошаговые уроки на YouTube и затем выбрать понравившийся фреймворк.

Если у вас появляются какие-то вопросы, то стоит заглянуть на StackOverflow.

Этим сайтом пользуются разработчики по всему миру. Здесь они делятся своим опытом и помогают другим решать их проблемы. Просто задайте вопрос, и вам предложат несколько возможных решений.

Итак, с фреймворками не так сложно разобраться, как кажется. Не тратьте время на панику — посмотрите пару руководств и попробуйте поработать со своим первым фреймворком.

Создание фреймворка. Класс Router

12 февраля 2010

В прошлый раз я описал построение простейшего, но довольно функционального компонента View. В этот раз займёмся Front Controller, Controller и Router. Код, приведённый ниже может не запускаться, не является безопасным, но объясняет общие принципы работы большинства MVC-фреймворков.

Front Controller является диспетчером запросов и, в зависимости от URL запускает нужный контроллер с нужными параметрами. В этом ему помогает Router, занимающийся непосредственно разбором URL и применением различных правил.

Для начала необходимо перенаправить все запросы на Front Controller, т.е. index.php. Для Apache это можно сделать через файл .htaccess, расположенный в той же директории, что и index.php:

Далее опишем index.php:

Конфигурация в routes.php будет выглядеть следующим образом:

Что должен сделать роутер?

Применить первое совпавшее правило из конфигурации. Вызвать соответствующий правилу контроллер с нужными параметрами.

Базовый класс контроллера будет выглядеть примерно так:

Создание фреймворка. Класс Router

«, $path, $uri); // Определить контроллер, action, параметры $segments = explode(‘/’, $internalRoute); $controllerName = array_shift($segments) . ‘Controller’; $controllerName = ucfirst($controllerName); $actionName = ‘action’ . ucfirst(array_shift($segments)); $parameters = $segments; выводит вот такое значение: (Newtest — это название проекта на локалке) Имя контроллера: NewtestController Экшн: actionNews Array ( [0] => view [1] => sport [2] => 229 ) routes: return array( ‘news/([a-z]+)/([0-9]+)’ => ‘news/view/$1/$2’, );
25.12.2020

Создание фреймворка на php с нуля. Класс Router. Урок 2

Просмотров: 25 272

06 сентября 2020

sovers us

Методом по умолчанию и вызываемым лучше управлять из контролера, а не роутера. Иначе теряется гибкость. Второе что не нравится это как быть если нужно вызвать post/category/apple ? category будет методом?

Все что относится к контролеру, лучше доверить контролеру и тогда не будет единых правил для всех контролеров.

Artyom Grigorev

Сложно понять чего, откуда и куда =))

Linux Mint

метод lowerCamelCase() у меня на Linux работает без lcfirst()

Linux Mint

А не проще метод new создать в классе posts, чем вот всю эту затею с классом posts-new (PostsNew) проворачивать? 🙂

Топ-пост этого месяца:  Вывод записей с миниатюрой по содержимому произвольного поля

p.s. хотя сам пример очень поучительный

mugen31337

Для проверки работоспособности контроллеров и методов, я бы лучше так сделал. Как-то красивее.
public function __construct()
<
echo ‘Контроллер ‘ . _CLASS_ . ‘ подключен
‘;
>

public function index ()
<
echo ‘Метод ‘ . _METHOD_ . ‘ вызван
‘;
>

Alexander Dev

Где можно скачать исходники ?

КС ГО

Только один вопрос. А зачем эти подстановки контроллеров и экшенов из URL? А если, скажем, в URL будет 3-4 сегмента через слеш? Не слишком ли много преобразований в запросе нужно сделать ради удобства? Ведь при этом кушаются мощности сервера и процессорное время тянется. Как мне кажется, лучше дать чёткую возможность задавать конкретные экшены, чем городить кучу кода и методов. Так, это сделано, например, в Laravel.

Кирилл Гришин

непонятно,как получаеться так что у автора все работает а у меня нет?

Охотник

спасибо, как раз то что было нужно

Poul Fly

?P Что здесь значит ‘P’ ?

jack smith

зачем регулярные, почему сразу не проверить существование класса контроллера?

Инжеватов Станислав

Еще бы выкладывали код с каждого урока ((( а то ошибки проверять сложно

павел Hechnqn

Андрей прям ваяет..как Куинджи,творческий подход))

Павел Чалов

Ubuntu 16.04 x64, apache 2.4.18, php 7.0
Насчёт всех этих манипуляций с регистром имён методов. У меня даже «eChO» нормально работает. Здесь не операционка «регистрозависимая» или нет, а сам язык программирования. А в php, согласно стандартной доркументации: «Чувствительны к регистру идентификаторы переменных и констант.», — т.е. на регистр методов и классов плевать ему должно быть на любой платформе, и метод «TestPage» будет вызываться одинаково успешно. А вот «$value» и «$VaLuE» будут разными переменными хоть на линуксах, хоть на винде. И вообще, «регистронезависимость windows» не к windows относится, а к файловой системе. Из-под linux на NTFS разделе два папки: «Новая Папка» и «Новая папка» точно так же невозможно создать, как и из-под windows.

Mihail McNamara

Очень полезный курс. Я тут yii2 немного понял, стал делать простенькие приложения и стал чувствовать себя разрабом. После просмотров 2 роликов данного курса — это чувство исчезло))

Wendelin Gerein

Классно. я блогодарен тебе Андрей

Вилы Выкидные

в автозагрузке у Вас is_file проверит, является ли $class файлом, но чтобы проверить, существует ли такой файл, то нужно юзать file_exists

IGOR Formanyuk

Спасибо за уроки! Продолжайте в том же духе!

Andrey Bogdanovskiy

спасибо за отличный материал и за качество его подачи, вы супер.

Создание фреймворка на php с нуля. Класс Router. Урок 2

Смотреть видео Создание фреймворка на php с нуля. Класс Router. Урок 2 онлайн, скачать на мобильный.

514 | 6
WebForMySelf | 3 год. назад

Премиум уроки по созданию сайта тут: https://webformyself.com/category/premium/

Приветствую вас, друзья. Продолжим создание собственного PHP фреймворка.

По итогу мы должны получить вполне функциональное решение, а заодно познакомиться с принципами работы современных PHP фреймворков. В этом уроке мы в целом завершим писать класс Router, который будет отвечать за маршрутизацию во фреймворке.

Также мы напишем черновой вариант функции автозагрузки, которая избавит нас от необходимости подключать каждый класс и будет делать это за нас.

В видео версии урока вы найдете ответы на такие вопросы:

• Как использовать регулярные выражения для маршрутизации?
• Именования и стандарты PSR?
• Чем может быть полезен стандарт комментирования PHPDoc?
• Как написать функцию автозагрузки классов?
• Как описать кастомное правило маршрутизации?

Создание фреймворка на php с нуля. Класс Router. Урок 2

Премиум уроки по созданию сайта тут: https://webformyself.com/category/premium/

Приветствую вас, друзья. Продолжим создание собственного PHP фреймворка.

По итогу мы должны получить вполне функциональное решение, а заодно познакомиться с принципами работы современных PHP фреймворков. В этом уроке мы в целом завершим писать класс Router, который будет отвечать за маршрутизацию во фреймворке.

Также мы напишем черновой вариант функции автозагрузки, которая избавит нас от необходимости подключать каждый класс и будет делать это за нас.

В видео версии урока вы найдете ответы на такие вопросы:

• Как использовать регулярные выражения для маршрутизации?
• Именования и стандарты PSR?
• Чем может быть полезен стандарт комментирования PHPDoc?
• Как написать функцию автозагрузки классов?
• Как описать кастомное правило маршрутизации?

Создание фреймворка на php с нуля. Класс Router. Урок 2

Показать панель управления

  • Опубликовано: 6 сен 2020
  • Премиум уроки по созданию сайта тут: webformyself.com/category/premium/
    Приветствую вас, друзья. Продолжим создание собственного PHP фреймворка.
    По итогу мы должны получить вполне функциональное решение, а заодно познакомиться с принципами работы современных PHP фреймворков. В этом уроке мы в целом завершим писать класс Router, который будет отвечать за маршрутизацию во фреймворке.
    Также мы напишем черновой вариант функции автозагрузки, которая избавит нас от необходимости подключать каждый класс и будет делать это за нас.
    В видео версии урока вы найдете ответы на такие вопросы:
    • Как использовать регулярные выражения для маршрутизации?
    • Именования и стандарты PSR?
    • Чем может быть полезен стандарт комментирования PHPDoc?
    • Как написать функцию автозагрузки классов?
    • Как описать кастомное правило маршрутизации?
    Создание фреймворка. Класс Router. Урок 2 — thexvid.com/video/8WEG50MLzwE/видео.html

Комментарии • 68

Методом по умолчанию и вызываемым лучше управлять из контролера, а не роутера. Иначе теряется гибкость. Второе что не нравится это как быть если нужно вызвать post/category/apple ? category будет методом?
Все что относится к контролеру, лучше доверить контролеру и тогда не будет единых правил для всех контролеров.

Сложно понять чего, откуда и куда =))

метод lowerCamelCase() у меня на Linux работает без lcfirst()

А не проще метод new создать в классе posts, чем вот всю эту затею с классом posts-new (PostsNew) проворачивать? 🙂
p.s. хотя сам пример очень поучительный

Для проверки работоспособности контроллеров и методов, я бы лучше так сделал. Как-то красивее.
public function __construct()
<
echo ‘Контроллер ‘ . __CLASS__ . ‘ подключен’;
>
public function index ()
<
echo ‘Метод ‘ . __METHOD__ . ‘ вызван’;
>

Где можно скачать исходники ?

Только один вопрос. А зачем эти подстановки контроллеров и экшенов из URL? А если, скажем, в URL будет 3-4 сегмента через слеш? Не слишком ли много преобразований в запросе нужно сделать ради удобства? Ведь при этом кушаются мощности сервера и процессорное время тянется. Как мне кажется, лучше дать чёткую возможность задавать конкретные экшены, чем городить кучу кода и методов. Так, это сделано, например, в Laravel.

@pinky 0 Для чего строится любая СМС? как не крути все равно получается 2 маршрута: 1) главная страница (пустой URL) и 2) префикс для входа на админку (хотя и его можно привязать к главной странице). Вот и возникает вопрос про огород с кучей лишнего кода. Покажите мне пальцем того, кто ищет в инете сайт с названием контроллера или метода того же контролерра?

Просто для удобства и читабельности внутреннего пути. Где-то читал, что даже если программа работает немного медленее, но более читабельна программистом, то считается тру. Просто потому, что её обслуживать проще и быстрее, а значит дешевле. Железо не дорого стоит, в отличии от труда программиста.

непонятно,как получаеться так что у автора все работает а у меня нет?

спасибо, как раз то что было нужно

?P Что здесь значит ‘P’ ?

зачем регулярные, почему сразу не проверить существование класса контроллера?

Еще бы выкладывали код с каждого урока ((( а то ошибки проверять сложно

Андрей прям ваяет..как Куинджи,творческий подход))

Помогите пожалуйста. Не выводится у меня posts/index на 8:35 мин. В чем может быть дело? Все вроде бы делаю как в видео.

почаще тестируйте код

где то что то пропустили

Ubuntu 16.04 x64, apache 2.4.18, php 7.0
Насчёт всех этих манипуляций с регистром имён методов. У меня даже «eChO» нормально работает. Здесь не операционка «регистрозависимая» или нет, а сам язык программирования. А в php, согласно стандартной доркументации: «Чувствительны к регистру идентификаторы переменных и констант.», — т.е. на регистр методов и классов плевать ему должно быть на любой платформе, и метод «TestPage» будет вызываться одинаково успешно. А вот «$value» и «$VaLuE» будут разными переменными хоть на линуксах, хоть на винде. И вообще, «регистронезависимость windows» не к windows относится, а к файловой системе. Из-под linux на NTFS разделе два папки: «Новая Папка» и «Новая папка» точно так же невозможно создать, как и из-под windows.

А, вон чё. У нас на каждое имя класса или метода будет файл с таким же именем, и вот тут регистр уже имеет значение. А почему бы в таком случае файли и папки не именовать тупо в нижнем регистре? Так проще было бы, и со строками меньше операций получилось бы.

Очень полезный курс. Я тут yii2 немного понял, стал делать простенькие приложения и стал чувствовать себя разрабом. После просмотров 2 роликов данного курса — это чувство исчезло))

Классно. я блогодарен тебе Андрей

в автозагрузке у Вас is_file проверит, является ли $class файлом, но чтобы проверить, существует ли такой файл, то нужно юзать file_exists

Спасибо за уроки! Продолжайте в том же духе!

спасибо за отличный материал и за качество его подачи, вы супер.

спасибо за видео!

в методе matchRoute на 20:30
мы пишим цикл где прописываем конкроллер и экшн для $route и дальше пишем self::$route = $route, то есть перезаписываем свойство. У меня пустой массив Route::$route , а у тебя все нормально. Почему так? 😀

Спасибо за Ваш труд.
У меня вопрос — если будет папка панели управления Admin, то как правильно написать к ней маршрут? Ведь по адресу mysite.loc/admin войти не получится, будет писать, что нет такого контроллера.
Спасибо

Спасибо большое, урок супер!

Действительно, очень увлекает! Андрей, продолжайте. Надеюсь, что дело дойдет и до постраничной навигации, регистрации и авторизации. Лично мне было-бы очень интересно посмотреть на Ваше решение. За уроки огромное спасибо.

«. есть метод before. если я напишу в адресной строке «. /before» — я обращусь к этому методу. я могу изменить модификатор доступа public на protected, но я так делать не хочу. «. Мы оставляем методу доступ public, а затем пишем вручную ограничения доступа. В чем выгода такого подхода?

Здравствуйте! Спасибо Вам большое за курс! Очень понятно, информативно и без воды и процедурного стиля. У меня созрел вопрос по поводу модификаторов) Почему для защиты полей класса и методов вы используете protected, а не private? Или подразумевается, что у класса Router будут наследники?

Здравствуйте! Где-то в каком-то уроке я немного коснулся этого момента, скорее всего в каком-то из следующих. Наследовать Router мы вряд ли будем. Я крайне редко использую private и использовать protected вместо private у меня уже скорее вошло в привычку (а вдруг в дальнейшем я захочу наследовать?). В данном случае роли особой модификатор не играет (хоть protected, хоть private), коль мы и не собираемся наследовать класс. Впрочем, я никого не ограничиваю вполне можно использовать и private 😉

все отлично спасибо ! есть ли привязка к IIS ?

Законспектировал для изучения и экспериментов весь проект 1-5 уроки.
У себя вместо файла 404.html после размышления назвал BadFormat.html и сообщение типа «неверный формат строки запроса». А то меня вводит в заблуждение сообщение не найдена страница.
Андрей, Спасибо большое. Мне очень нравится твой стиль преподавания.
Не знаю, почему так мало просмотров и лайков.

Спасибо за теплые слова!

Спасибо! Очень познавательное видео, особенно заинтересовали регулярные выражения, которые ранее я нигде не использовал. Продолжайте в том же духе! Было бы еще интересно посмотреть, как подключать в адресную строку дополнительные параметры, такие, как язык, роут-префикс (дефольт, админ, эррор и т.д.) и прочие прочие другие.

Да, есть. Вот ссылка: webformyself.com/category/premium/php-premium/regexpphp/

Не понятно откуда пришла $class в автозагрузчике spl_autoload_register(function($class) <
$file=APP.»/controllers/$class.php»;
if(is_file($file)) <
require_once $file;
>
>);

Это не обязательно должна быть переменная $class? Вместо переменной $class может быть быть любая другая, например $autoLoaudClass. Разработчики PHP все учли! 🙂

Пожалуйста)
Относительно 5-го урока. Точных сроков не назову, но уже скоро должен быть опубликован на канале.

Дякую.
Уроки — супер !
Коли буде 5-й урок ?

Параметром функции. Функция автозагрузки работает так. Когда в коде используется класс, который не был ранее подключен, тогда вызывается функция автозагрузки, которая попытается подключить данный класс, имя которого будет передано параметром. Подробнее в документации — php.net/manual/ru/function.autoload.php

Топ-пост этого месяца:  Британские пользователи считают рекламу гарантом свободы в Сети

Спасибо! Отличные уроки! Ждем дальнейших лекций!

Spasibo za urok!

Андрей, добрый день.
Уроки у вас действительно шикарные, спору нет. И даже хваленные курсы от Игоря Борисова значительно уступают вашему материалу. У вас нет, присущих Борисову пауз и ненужных многократных повторений одного слова, да и результат занятия виден практически сразу. Мало того, есть вера в то, что по окончании курса у меня может быть собственный сайт, а не просто методичка с курсом занятий.)
Но сразу прошу пролить свет на такой вопрос — вы планируете «затянуть в сети» этими, пока еще общедоступными уроками, заинтересованных в вашем материале людей, а потом сделать их (уроки) премиум-уроками (т.е. такими, к которым без оплаты доступа не будет) ?
/в любом случае, спасибо за ваш труд. Уверен, на данный момент, ваши курсы наиболее интересны и информативны. /

Игорь, я рад, что мы пришли к общему знаменателю и, еще раз подчеркну, что я очень уважаю то, что делает ваш тёзка, но подача Андрея мне ближе).

Да, Сергей — это очень греет! Просто у курсов разные цели, Борисов дает твердую платформу, данный курс — варианты как строить дома на этой платформе 🙂

Игорь, я тоже смотрю Борисова на скорости 1,25 )
И я абсолютно согласен с вашими словами по поводу расшиненности, понятности и т.д..
Но, согласитесь, приятно видеть результаты трудов, а не только знать, что нечто подобное можно сделать.

Безусловно, данный курс очень крут! Автору лайк и подписка! Но занижать достоинства Борисова не стОит — он очень крут. Борисов дает расширенную и понятную базу, рассказывает о деталях, а Андрей строит из этих деталей простое и функциональное авто. По поводу повторений слов Борисова — смотрю его на скорости 1.25 или 1.5 🙂

Андрей, ваши слова греют душу ( и то, что будет продолжение, и то, что «база» будет общедоступна).
Еще раз спасибо за ваши уроки, вы отличный преподаватель.
(с) . и это хорошо!
)

Вот это тема! Вот это молодец, спасибо! Один из немногих кто преподаёт нормальные вещи в виде ООП с MVC, автолоадером и рутами! А не всякие отсталые процедурные простыни инклудов через if(get == ) elseif -__-
Замучу себе на гитхап на всякий слу44.!
Осталось ещё добавить видео как сделать свой шаблонизатор и виджеты для него!

Ну когда же выйдет третий урок.

Супер, просто супер, жду продолжения.

Спасибо!
Но вы используете много static это не будет код долго обрабатывать

Спасибо вам огромное за ответ!
Я с этим вопросам мучился где то месяц не мог ответ найти.
А вы проста за несколько минут ответили. Я очень блогадарень вам. Желаю успехов.
Если я могу вам как то помочь, пешите мне. С радостью отвечу!

Создание фреймворка на php с нуля. Класс Router. Урок 2

Oynatıcı kontrollerini göster

  • katma 6 Eyl 2020
  • Премиум уроки по созданию сайта тут: webformyself.com/category/premium/
    Приветствую вас, друзья. Продолжим создание собственного PHP фреймворка.
    По итогу мы должны получить вполне функциональное решение, а заодно познакомиться с принципами работы современных PHP фреймворков. В этом уроке мы в целом завершим писать класс Router, который будет отвечать за маршрутизацию во фреймворке.
    Также мы напишем черновой вариант функции автозагрузки, которая избавит нас от необходимости подключать каждый класс и будет делать это за нас.
    В видео версии урока вы найдете ответы на такие вопросы:
    • Как использовать регулярные выражения для маршрутизации?
    • Именования и стандарты PSR?
    • Чем может быть полезен стандарт комментирования PHPDoc?
    • Как написать функцию автозагрузки классов?
    • Как описать кастомное правило маршрутизации?
    Создание фреймворка. Класс Router. Урок 2 — trclips.com/video/8WEG50MLzwE/video.html

YORUMLAR • 68

Методом по умолчанию и вызываемым лучше управлять из контролера, а не роутера. Иначе теряется гибкость. Второе что не нравится это как быть если нужно вызвать post/category/apple ? category будет методом?
Все что относится к контролеру, лучше доверить контролеру и тогда не будет единых правил для всех контролеров.

Сложно понять чего, откуда и куда =))

метод lowerCamelCase() у меня на Linux работает без lcfirst()

А не проще метод new создать в классе posts, чем вот всю эту затею с классом posts-new (PostsNew) проворачивать? 🙂
p.s. хотя сам пример очень поучительный

Для проверки работоспособности контроллеров и методов, я бы лучше так сделал. Как-то красивее.
public function __construct()
<
echo ‘Контроллер ‘ . __CLASS__ . ‘ подключен’;
>
public function index ()
<
echo ‘Метод ‘ . __METHOD__ . ‘ вызван’;
>

Где можно скачать исходники ?

Только один вопрос. А зачем эти подстановки контроллеров и экшенов из URL? А если, скажем, в URL будет 3-4 сегмента через слеш? Не слишком ли много преобразований в запросе нужно сделать ради удобства? Ведь при этом кушаются мощности сервера и процессорное время тянется. Как мне кажется, лучше дать чёткую возможность задавать конкретные экшены, чем городить кучу кода и методов. Так, это сделано, например, в Laravel.

@pinky 0 Для чего строится любая СМС? как не крути все равно получается 2 маршрута: 1) главная страница (пустой URL) и 2) префикс для входа на админку (хотя и его можно привязать к главной странице). Вот и возникает вопрос про огород с кучей лишнего кода. Покажите мне пальцем того, кто ищет в инете сайт с названием контроллера или метода того же контролерра?

Просто для удобства и читабельности внутреннего пути. Где-то читал, что даже если программа работает немного медленее, но более читабельна программистом, то считается тру. Просто потому, что её обслуживать проще и быстрее, а значит дешевле. Железо не дорого стоит, в отличии от труда программиста.

непонятно,как получаеться так что у автора все работает а у меня нет?

спасибо, как раз то что было нужно

?P Что здесь значит ‘P’ ?

зачем регулярные, почему сразу не проверить существование класса контроллера?

Еще бы выкладывали код с каждого урока ((( а то ошибки проверять сложно

Андрей прям ваяет..как Куинджи,творческий подход))

Помогите пожалуйста. Не выводится у меня posts/index на 8:35 мин. В чем может быть дело? Все вроде бы делаю как в видео.

почаще тестируйте код

где то что то пропустили

Ubuntu 16.04 x64, apache 2.4.18, php 7.0
Насчёт всех этих манипуляций с регистром имён методов. У меня даже «eChO» нормально работает. Здесь не операционка «регистрозависимая» или нет, а сам язык программирования. А в php, согласно стандартной доркументации: «Чувствительны к регистру идентификаторы переменных и констант.», — т.е. на регистр методов и классов плевать ему должно быть на любой платформе, и метод «TestPage» будет вызываться одинаково успешно. А вот «$value» и «$VaLuE» будут разными переменными хоть на линуксах, хоть на винде. И вообще, «регистронезависимость windows» не к windows относится, а к файловой системе. Из-под linux на NTFS разделе два папки: «Новая Папка» и «Новая папка» точно так же невозможно создать, как и из-под windows.

А, вон чё. У нас на каждое имя класса или метода будет файл с таким же именем, и вот тут регистр уже имеет значение. А почему бы в таком случае файли и папки не именовать тупо в нижнем регистре? Так проще было бы, и со строками меньше операций получилось бы.

Очень полезный курс. Я тут yii2 немного понял, стал делать простенькие приложения и стал чувствовать себя разрабом. После просмотров 2 роликов данного курса — это чувство исчезло))

Классно. я блогодарен тебе Андрей

в автозагрузке у Вас is_file проверит, является ли $class файлом, но чтобы проверить, существует ли такой файл, то нужно юзать file_exists

Спасибо за уроки! Продолжайте в том же духе!

спасибо за отличный материал и за качество его подачи, вы супер.

спасибо за видео!

в методе matchRoute на 20:30
мы пишим цикл где прописываем конкроллер и экшн для $route и дальше пишем self::$route = $route, то есть перезаписываем свойство. У меня пустой массив Route::$route , а у тебя все нормально. Почему так? 😀

Спасибо за Ваш труд.
У меня вопрос — если будет папка панели управления Admin, то как правильно написать к ней маршрут? Ведь по адресу mysite.loc/admin войти не получится, будет писать, что нет такого контроллера.
Спасибо

Спасибо большое, урок супер!

Действительно, очень увлекает! Андрей, продолжайте. Надеюсь, что дело дойдет и до постраничной навигации, регистрации и авторизации. Лично мне было-бы очень интересно посмотреть на Ваше решение. За уроки огромное спасибо.

«. есть метод before. если я напишу в адресной строке «. /before» — я обращусь к этому методу. я могу изменить модификатор доступа public на protected, но я так делать не хочу. «. Мы оставляем методу доступ public, а затем пишем вручную ограничения доступа. В чем выгода такого подхода?

Здравствуйте! Спасибо Вам большое за курс! Очень понятно, информативно и без воды и процедурного стиля. У меня созрел вопрос по поводу модификаторов) Почему для защиты полей класса и методов вы используете protected, а не private? Или подразумевается, что у класса Router будут наследники?

Здравствуйте! Где-то в каком-то уроке я немного коснулся этого момента, скорее всего в каком-то из следующих. Наследовать Router мы вряд ли будем. Я крайне редко использую private и использовать protected вместо private у меня уже скорее вошло в привычку (а вдруг в дальнейшем я захочу наследовать?). В данном случае роли особой модификатор не играет (хоть protected, хоть private), коль мы и не собираемся наследовать класс. Впрочем, я никого не ограничиваю вполне можно использовать и private 😉

все отлично спасибо ! есть ли привязка к IIS ?

Законспектировал для изучения и экспериментов весь проект 1-5 уроки.
У себя вместо файла 404.html после размышления назвал BadFormat.html и сообщение типа «неверный формат строки запроса». А то меня вводит в заблуждение сообщение не найдена страница.
Андрей, Спасибо большое. Мне очень нравится твой стиль преподавания.
Не знаю, почему так мало просмотров и лайков.

Спасибо за теплые слова!

Спасибо! Очень познавательное видео, особенно заинтересовали регулярные выражения, которые ранее я нигде не использовал. Продолжайте в том же духе! Было бы еще интересно посмотреть, как подключать в адресную строку дополнительные параметры, такие, как язык, роут-префикс (дефольт, админ, эррор и т.д.) и прочие прочие другие.

Да, есть. Вот ссылка: webformyself.com/category/premium/php-premium/regexpphp/

Не понятно откуда пришла $class в автозагрузчике spl_autoload_register(function($class) <
$file=APP.»/controllers/$class.php»;
if(is_file($file)) <
require_once $file;
>
>);

Это не обязательно должна быть переменная $class? Вместо переменной $class может быть быть любая другая, например $autoLoaudClass. Разработчики PHP все учли! 🙂

Пожалуйста)
Относительно 5-го урока. Точных сроков не назову, но уже скоро должен быть опубликован на канале.

Дякую.
Уроки — супер !
Коли буде 5-й урок ?

Параметром функции. Функция автозагрузки работает так. Когда в коде используется класс, который не был ранее подключен, тогда вызывается функция автозагрузки, которая попытается подключить данный класс, имя которого будет передано параметром. Подробнее в документации — php.net/manual/ru/function.autoload.php

Спасибо! Отличные уроки! Ждем дальнейших лекций!

Spasibo za urok!

Андрей, добрый день.
Уроки у вас действительно шикарные, спору нет. И даже хваленные курсы от Игоря Борисова значительно уступают вашему материалу. У вас нет, присущих Борисову пауз и ненужных многократных повторений одного слова, да и результат занятия виден практически сразу. Мало того, есть вера в то, что по окончании курса у меня может быть собственный сайт, а не просто методичка с курсом занятий.)
Но сразу прошу пролить свет на такой вопрос — вы планируете «затянуть в сети» этими, пока еще общедоступными уроками, заинтересованных в вашем материале людей, а потом сделать их (уроки) премиум-уроками (т.е. такими, к которым без оплаты доступа не будет) ?
/в любом случае, спасибо за ваш труд. Уверен, на данный момент, ваши курсы наиболее интересны и информативны. /

Игорь, я рад, что мы пришли к общему знаменателю и, еще раз подчеркну, что я очень уважаю то, что делает ваш тёзка, но подача Андрея мне ближе).

Да, Сергей — это очень греет! Просто у курсов разные цели, Борисов дает твердую платформу, данный курс — варианты как строить дома на этой платформе 🙂

Игорь, я тоже смотрю Борисова на скорости 1,25 )
И я абсолютно согласен с вашими словами по поводу расшиненности, понятности и т.д..
Но, согласитесь, приятно видеть результаты трудов, а не только знать, что нечто подобное можно сделать.

Топ-пост этого месяца:  LiveInternet — установка счетчика LI на сайт — на что смотреть в статистике посещений по версии

Безусловно, данный курс очень крут! Автору лайк и подписка! Но занижать достоинства Борисова не стОит — он очень крут. Борисов дает расширенную и понятную базу, рассказывает о деталях, а Андрей строит из этих деталей простое и функциональное авто. По поводу повторений слов Борисова — смотрю его на скорости 1.25 или 1.5 🙂

Андрей, ваши слова греют душу ( и то, что будет продолжение, и то, что «база» будет общедоступна).
Еще раз спасибо за ваши уроки, вы отличный преподаватель.
(с) . и это хорошо!
)

Вот это тема! Вот это молодец, спасибо! Один из немногих кто преподаёт нормальные вещи в виде ООП с MVC, автолоадером и рутами! А не всякие отсталые процедурные простыни инклудов через if(get == ) elseif -__-
Замучу себе на гитхап на всякий слу44.!
Осталось ещё добавить видео как сделать свой шаблонизатор и виджеты для него!

Ну когда же выйдет третий урок.

Супер, просто супер, жду продолжения.

Спасибо!
Но вы используете много static это не будет код долго обрабатывать

Спасибо вам огромное за ответ!
Я с этим вопросам мучился где то месяц не мог ответ найти.
А вы проста за несколько минут ответили. Я очень блогадарень вам. Желаю успехов.
Если я могу вам как то помочь, пешите мне. С радостью отвечу!

Создание фреймворка на php с нуля. Класс Router. Урок 2

Паказваць кнопкі кіравання прайгравальніка

  • Апублікавана 6 Врс 2020
  • Премиум уроки по созданию сайта тут: webformyself.com/category/premium/
    Приветствую вас, друзья. Продолжим создание собственного PHP фреймворка.
    По итогу мы должны получить вполне функциональное решение, а заодно познакомиться с принципами работы современных PHP фреймворков. В этом уроке мы в целом завершим писать класс Router, который будет отвечать за маршрутизацию во фреймворке.
    Также мы напишем черновой вариант функции автозагрузки, которая избавит нас от необходимости подключать каждый класс и будет делать это за нас.
    В видео версии урока вы найдете ответы на такие вопросы:
    • Как использовать регулярные выражения для маршрутизации?
    • Именования и стандарты PSR?
    • Чем может быть полезен стандарт комментирования PHPDoc?
    • Как написать функцию автозагрузки классов?
    • Как описать кастомное правило маршрутизации?
    Создание фреймворка. Класс Router. Урок 2 — by-clips.com/video/8WEG50MLzwE/відэа.html

Каментарыі • 68

Методом по умолчанию и вызываемым лучше управлять из контролера, а не роутера. Иначе теряется гибкость. Второе что не нравится это как быть если нужно вызвать post/category/apple ? category будет методом?
Все что относится к контролеру, лучше доверить контролеру и тогда не будет единых правил для всех контролеров.

Сложно понять чего, откуда и куда =))

метод lowerCamelCase() у меня на Linux работает без lcfirst()

А не проще метод new создать в классе posts, чем вот всю эту затею с классом posts-new (PostsNew) проворачивать? 🙂
p.s. хотя сам пример очень поучительный

Для проверки работоспособности контроллеров и методов, я бы лучше так сделал. Как-то красивее.
public function __construct()
<
echo ‘Контроллер ‘ . __CLASS__ . ‘ подключен’;
>
public function index ()
<
echo ‘Метод ‘ . __METHOD__ . ‘ вызван’;
>

Где можно скачать исходники ?

Только один вопрос. А зачем эти подстановки контроллеров и экшенов из URL? А если, скажем, в URL будет 3-4 сегмента через слеш? Не слишком ли много преобразований в запросе нужно сделать ради удобства? Ведь при этом кушаются мощности сервера и процессорное время тянется. Как мне кажется, лучше дать чёткую возможность задавать конкретные экшены, чем городить кучу кода и методов. Так, это сделано, например, в Laravel.

@pinky 0 Для чего строится любая СМС? как не крути все равно получается 2 маршрута: 1) главная страница (пустой URL) и 2) префикс для входа на админку (хотя и его можно привязать к главной странице). Вот и возникает вопрос про огород с кучей лишнего кода. Покажите мне пальцем того, кто ищет в инете сайт с названием контроллера или метода того же контролерра?

Просто для удобства и читабельности внутреннего пути. Где-то читал, что даже если программа работает немного медленее, но более читабельна программистом, то считается тру. Просто потому, что её обслуживать проще и быстрее, а значит дешевле. Железо не дорого стоит, в отличии от труда программиста.

непонятно,как получаеться так что у автора все работает а у меня нет?

спасибо, как раз то что было нужно

?P Что здесь значит ‘P’ ?

зачем регулярные, почему сразу не проверить существование класса контроллера?

Еще бы выкладывали код с каждого урока ((( а то ошибки проверять сложно

Андрей прям ваяет..как Куинджи,творческий подход))

Помогите пожалуйста. Не выводится у меня posts/index на 8:35 мин. В чем может быть дело? Все вроде бы делаю как в видео.

почаще тестируйте код

где то что то пропустили

Ubuntu 16.04 x64, apache 2.4.18, php 7.0
Насчёт всех этих манипуляций с регистром имён методов. У меня даже «eChO» нормально работает. Здесь не операционка «регистрозависимая» или нет, а сам язык программирования. А в php, согласно стандартной доркументации: «Чувствительны к регистру идентификаторы переменных и констант.», — т.е. на регистр методов и классов плевать ему должно быть на любой платформе, и метод «TestPage» будет вызываться одинаково успешно. А вот «$value» и «$VaLuE» будут разными переменными хоть на линуксах, хоть на винде. И вообще, «регистронезависимость windows» не к windows относится, а к файловой системе. Из-под linux на NTFS разделе два папки: «Новая Папка» и «Новая папка» точно так же невозможно создать, как и из-под windows.

А, вон чё. У нас на каждое имя класса или метода будет файл с таким же именем, и вот тут регистр уже имеет значение. А почему бы в таком случае файли и папки не именовать тупо в нижнем регистре? Так проще было бы, и со строками меньше операций получилось бы.

Очень полезный курс. Я тут yii2 немного понял, стал делать простенькие приложения и стал чувствовать себя разрабом. После просмотров 2 роликов данного курса — это чувство исчезло))

Классно. я блогодарен тебе Андрей

в автозагрузке у Вас is_file проверит, является ли $class файлом, но чтобы проверить, существует ли такой файл, то нужно юзать file_exists

Спасибо за уроки! Продолжайте в том же духе!

спасибо за отличный материал и за качество его подачи, вы супер.

спасибо за видео!

в методе matchRoute на 20:30
мы пишим цикл где прописываем конкроллер и экшн для $route и дальше пишем self::$route = $route, то есть перезаписываем свойство. У меня пустой массив Route::$route , а у тебя все нормально. Почему так? 😀

Спасибо за Ваш труд.
У меня вопрос — если будет папка панели управления Admin, то как правильно написать к ней маршрут? Ведь по адресу mysite.loc/admin войти не получится, будет писать, что нет такого контроллера.
Спасибо

Спасибо большое, урок супер!

Действительно, очень увлекает! Андрей, продолжайте. Надеюсь, что дело дойдет и до постраничной навигации, регистрации и авторизации. Лично мне было-бы очень интересно посмотреть на Ваше решение. За уроки огромное спасибо.

«. есть метод before. если я напишу в адресной строке «. /before» — я обращусь к этому методу. я могу изменить модификатор доступа public на protected, но я так делать не хочу. «. Мы оставляем методу доступ public, а затем пишем вручную ограничения доступа. В чем выгода такого подхода?

Здравствуйте! Спасибо Вам большое за курс! Очень понятно, информативно и без воды и процедурного стиля. У меня созрел вопрос по поводу модификаторов) Почему для защиты полей класса и методов вы используете protected, а не private? Или подразумевается, что у класса Router будут наследники?

Здравствуйте! Где-то в каком-то уроке я немного коснулся этого момента, скорее всего в каком-то из следующих. Наследовать Router мы вряд ли будем. Я крайне редко использую private и использовать protected вместо private у меня уже скорее вошло в привычку (а вдруг в дальнейшем я захочу наследовать?). В данном случае роли особой модификатор не играет (хоть protected, хоть private), коль мы и не собираемся наследовать класс. Впрочем, я никого не ограничиваю вполне можно использовать и private 😉

все отлично спасибо ! есть ли привязка к IIS ?

Законспектировал для изучения и экспериментов весь проект 1-5 уроки.
У себя вместо файла 404.html после размышления назвал BadFormat.html и сообщение типа «неверный формат строки запроса». А то меня вводит в заблуждение сообщение не найдена страница.
Андрей, Спасибо большое. Мне очень нравится твой стиль преподавания.
Не знаю, почему так мало просмотров и лайков.

Спасибо за теплые слова!

Спасибо! Очень познавательное видео, особенно заинтересовали регулярные выражения, которые ранее я нигде не использовал. Продолжайте в том же духе! Было бы еще интересно посмотреть, как подключать в адресную строку дополнительные параметры, такие, как язык, роут-префикс (дефольт, админ, эррор и т.д.) и прочие прочие другие.

Да, есть. Вот ссылка: webformyself.com/category/premium/php-premium/regexpphp/

Не понятно откуда пришла $class в автозагрузчике spl_autoload_register(function($class) <
$file=APP.»/controllers/$class.php»;
if(is_file($file)) <
require_once $file;
>
>);

Это не обязательно должна быть переменная $class? Вместо переменной $class может быть быть любая другая, например $autoLoaudClass. Разработчики PHP все учли! 🙂

Пожалуйста)
Относительно 5-го урока. Точных сроков не назову, но уже скоро должен быть опубликован на канале.

Дякую.
Уроки — супер !
Коли буде 5-й урок ?

Параметром функции. Функция автозагрузки работает так. Когда в коде используется класс, который не был ранее подключен, тогда вызывается функция автозагрузки, которая попытается подключить данный класс, имя которого будет передано параметром. Подробнее в документации — php.net/manual/ru/function.autoload.php

Спасибо! Отличные уроки! Ждем дальнейших лекций!

Spasibo za urok!

Андрей, добрый день.
Уроки у вас действительно шикарные, спору нет. И даже хваленные курсы от Игоря Борисова значительно уступают вашему материалу. У вас нет, присущих Борисову пауз и ненужных многократных повторений одного слова, да и результат занятия виден практически сразу. Мало того, есть вера в то, что по окончании курса у меня может быть собственный сайт, а не просто методичка с курсом занятий.)
Но сразу прошу пролить свет на такой вопрос — вы планируете «затянуть в сети» этими, пока еще общедоступными уроками, заинтересованных в вашем материале людей, а потом сделать их (уроки) премиум-уроками (т.е. такими, к которым без оплаты доступа не будет) ?
/в любом случае, спасибо за ваш труд. Уверен, на данный момент, ваши курсы наиболее интересны и информативны. /

Игорь, я рад, что мы пришли к общему знаменателю и, еще раз подчеркну, что я очень уважаю то, что делает ваш тёзка, но подача Андрея мне ближе).

Да, Сергей — это очень греет! Просто у курсов разные цели, Борисов дает твердую платформу, данный курс — варианты как строить дома на этой платформе 🙂

Игорь, я тоже смотрю Борисова на скорости 1,25 )
И я абсолютно согласен с вашими словами по поводу расшиненности, понятности и т.д..
Но, согласитесь, приятно видеть результаты трудов, а не только знать, что нечто подобное можно сделать.

Безусловно, данный курс очень крут! Автору лайк и подписка! Но занижать достоинства Борисова не стОит — он очень крут. Борисов дает расширенную и понятную базу, рассказывает о деталях, а Андрей строит из этих деталей простое и функциональное авто. По поводу повторений слов Борисова — смотрю его на скорости 1.25 или 1.5 🙂

Андрей, ваши слова греют душу ( и то, что будет продолжение, и то, что «база» будет общедоступна).
Еще раз спасибо за ваши уроки, вы отличный преподаватель.
(с) . и это хорошо!
)

Вот это тема! Вот это молодец, спасибо! Один из немногих кто преподаёт нормальные вещи в виде ООП с MVC, автолоадером и рутами! А не всякие отсталые процедурные простыни инклудов через if(get == ) elseif -__-
Замучу себе на гитхап на всякий слу44.!
Осталось ещё добавить видео как сделать свой шаблонизатор и виджеты для него!

Ну когда же выйдет третий урок.

Супер, просто супер, жду продолжения.

Спасибо!
Но вы используете много static это не будет код долго обрабатывать

Спасибо вам огромное за ответ!
Я с этим вопросам мучился где то месяц не мог ответ найти.
А вы проста за несколько минут ответили. Я очень блогадарень вам. Желаю успехов.
Если я могу вам как то помочь, пешите мне. С радостью отвечу!

Добавить комментарий