Про меня
- Из Воронежа
- Инженер CS, ZCE, переводчик
- Писатель, рецензент и редактор
- Докладчик
- Не кусаюсь
Свои проекты и OpenSource
В прошлом
- code-igniter.ru
- samlab.ws
Работы
- Siemens (ABAP, LiveLink, J2EE)
- Docufide, сейчас Parchment Exchange (J2EE)
- Scinovate (Drupal)
- Wrike.com (J2EE)
- MeetFriends (Russia Today)
- NNM
- CleverTech (Yii 1.1)
- Stay.com (Yii 1.1, Android)
Планы
- Теория, практика, общение, вопросы
- Хорошо и полезно проведём время
- Пожелания?
Пространства имён
- namespace my\name;
- use \my\name\Class;
- use \my\name\Class as BaseClass;
- new Class();
- new name\Class();
- new \Class();
Позднее статическое связывание (LSB)
- self::, __CLASS__
- static::, get_called_class()
Анонимные функции
- $f = function ($arg) { ... }
- function ($a, $b) use ($c, &$d) { ... }
- Нельзя сериализовать (почти)
PHP 5.4
- $this в анонимных функциях
- Трейты
- Короткий синтаксис массивов
- <?=
- Вебсервер
Трейты
- trait Feature { ... }
- class MyClass { use Feature; }
- копи→пейст
Вебсервер
php -S localhost:8000
Основы
- Инкапсуляция
- Наследование
- Полиморфизм
- Агрегирование
- SOLID
- KISS
- YAGNI
- DRY
Инкапсуляция
- Геттеры-сеттеры
- Реалии PHP
Полиморфизм, интерфейс, абстрактный класс
- Полиморфизм = взаимозаменяемость объектов с одинаковым интерфейсом
- Интерфейс = контракт
- Абстрактный класс = базовая реализация
- instanceof
Агрегирование
- Оно же делегирование
- Оно же принадлежность
- А внутри B выполняет отдельные задачи, извне недоступен
- По ссылке (Агрегация) и по значению (Композиция)
SOLID
- Single responsibility - единственной обязанности - каждый класс занимается одной задачей.
- Open/closed - открытости/закрытости - возможность расширения без изменений. Через наследование, через полиморфизм.
- Liskov substitution - подстановки Барбары Лисков - объект можно заменить наследниками без последствий.
- Interface segregation - разделения интерфейса - специализированные интерфейсы надо отделять.
- Dependency inversion - инверсии зависимостей - зависим от абстракций, а не от реализаций (Open/closed + LSP).
KISS
- Чем проще, тем лучше
- Бритва Оккама
YAGNI
- Вам оно не надо
- Отсутствие решения тоже решение
DRY
- Единое место для сходного кода / сущностей / данных
- Не всё, что похоже, и правда сходно
Команды
- init - новый composer.json
- require - добавить пакет в require файла composer.json
- remove - убить пакет из composer.json
- validate - проверить синтаксис composer.json
- install - установить пакеты из composer.lock
- update - обновить composer.lock и установить из него пакеты
- create-project - создать проект на основе пакета
Пакеты
- Ставятся в vendor. Руками не трогать!
- Приложение тоже пакет.
composer.json
- name - имя пакета
- мета информация: description, keywords, homepage...
- minimum-stability - какие пакеты тянуть из require (dev, alpha, beta, RC, stable)
- require - всегда нужные пакеты
- require-dev - пакеты для разработки
- suggest - предложить их в конце установки, но не ставить
- autoload - правила загрузки
классов
- bin - слинковать файл в vendor/bin
composer.lock
- фиксирует версии
- читается только у корневого пакета при install
- обновляется при update
global
- Пакет можно поставить глобально.
- composer.json в COMPOSER_HOME (обычно в домашней директории).
- Подходит для инструментов.
Полезные ключики
- --prefer-dist - ставить из zip-ов, не вытягивать git-репозиторий
- --no-dev - не ставить пакеты из require-dev
- --dry-run - симуляция установки без установки
- --no-interaction - пытаться автоматически разрулить спорные моменты (полезно для CI)
- --optimize-autoloader - создать карту файлов для автозагрузчика
Что такое Yii 2.0?
- PHP 5.4+.
- Сбалансированный.
- Стабильный с 12 октября 2014 и поддерживаемый.
- Лицензирован под BSD.
- Решает все основные задачи веб-разработки.
- REST API framework.
- Инструменты для отладки.
- Генерация кода.
- Очень приятная работа с данными.
- Хорошая документация и дружелюбное сообщество.
Как перейти с 1.1 на 2.0
- Просто — никак.
- А стоит ли?
- Если да — переписывать или портировать.
composer global require "fxp/composer-asset-plugin:1.0.0-beta3"
composer create-project --prefer-dist yiisoft/yii2-app-basic helloworld
- Контроллер
- View
- Передаём данные
MVC
- Модель
- View
- Контроллер
- Что куда?
Компоненты
- Yii::$app->
- не всё обязано быть компонентом
- Object
- Если ничего не надо, просто не наследоваться
События
- Локальные
- Глобальные
- Зачем?
Алиасы
- Что это такое?
- URL и файлы
- Стандартные
- Алиасы расширений
- bower / npm
Сервис-локатор
- Реестр.
- Для чего? Отложенная загрузка, единственные экземпляры, ...
- Yii::$app
DI контейнер
- Объект, который знает как создать и настроить другие объекты и их зависимости.
- Для чего?
- Yii::$container, Yii::createObject
Делаем витрину
Сделаем витрину для магазина. Магазином называть не будем потому как платежи не
принмиаем и за наличием товаров не следим.
Формируем требования
- А будет ли магазин? Чаще это витрины :)
- А не сделать ли ещё и X?
Важно быть на одной волне с владельцем бизнеса
- У него всегда видение шире!
- DDD
Оцениваем время
- Раскидываем по задачкам: Trello, Pivotal.
- Оцениваем каждую.
- Суммируем.
- Запас ×1.5+
Навёрстываем минимальный layout
- asset-ы: куда сложить, как тянуть из bower
- bootstrap
- product
- category
- image
- order
- order_item
- user
Соглашения
- Единственное число
- Не приделывать имя таблицы к полям
- Не включать префикс в название модели
- PK именуйте id
- Используйте внешние ключи
- Заканчивайте из на _id
- fk-source_table-source_column-target_table-target_column
- Связи называйте в соотвествующем числе
Миграции
- Что такое и зачем?
- Не использовать модели.
- Запускалась и ушла в репу - не трогать!
- Не запускалась и ушла в репу - поправить!
- Для MySQL указывайте engine и collation.
- Руками не трогать!
Создадим и применим...
- Поправим юзера
- Создадим всё остальное
Генерим всё через Gii
- UI
- Консоль
- common, frontend, backend
Пользователи
- Как работает то что уже есть?
Как ветвиться?
Полезняшки
- git pull --rebase
- git bisect
- hub
Вот теперь можно подключать команду к коду...
Каталог
- Leveled list
- Выбираем одним запросом, строим рекурсивно
- Редактор простой по одной категории
Загрузка картинок
- Не сохраняем отдельные файлы
- Валидация
- Конвертация
О работе в команде
- Доверие
- коммуникация
- обещания
- сроки
- незаменимость
- иерархия
Корзина
- Добавить
- Удалить
- Изменить количество (+/-)
- Заказать
Сессии
- В базу писать не надо
- Как сохранить корзину надолго?
Куки
- Мало места?
- Кука + база
- order: status, secret
- Чистим кроном
email
- При помощи Yii
- Отдать на внешку??? Внешние API
- dkim, spf
События
- Как выкинуть
- Как прицепиться
- Глобальный диспетчер
Откуда мне знать, что оно всё работает?
Что потестить?
- Юнит - вычисление суммы заказа
- Заказ
Начальный конфиг
- nginx + php-fpm
- PHP 5.6
- MariaDB
Автоматизация (или полуавтомат)
Внешние сервисы
- Почему не email, jabber?
- https://github.com/getsentry/sentry
- Rollbar
production-конфиг
- init
- YII_DEBUG = false
- Кеш
Инструменты
- debug toolbar
- XDebug
- XHProf
- Pinba
Масштрабирование
- round robin
- Разделяем по серверам
- Репликация БД
Сообщения
- yii message
- message source
- Исходный язык английский
- ICU
Данные
Всегда по-разному. Пример?
Свой Rule
- Дополним базу алиасом
- Генерация алиаса по title
- Своё правило
Общие принцыпы
- filter input
- escape output
RBAC
- Что такое?
- Как работает?
- закрываем админку
Выдача токена
- Отдельный action
- Передача хеша?
Вопросы?