МК

Александр Макаров

Yii core team, Stay.com

Yii

Про меня

  • Из Воронежа
  • Инженер 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)

Знакомимся?

  • Кто?
  • Откуда?
  • Опыт?

Планы

  • Теория, практика, общение, вопросы
  • Хорошо и полезно проведём время
  • Пожелания?

Освежим знания?

PHP 5.3

Пространства имён

  • 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

Трейты

  • 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

  • Единое место для сходного кода / сущностей / данных
  • Не всё, что похоже, и правда сходно

Composer

Команды

  • 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 - создать карту файлов для автозагрузчика

Приватные пакеты

https://getcomposer.org/doc/articles/handling-private-packages-with-satis.md

Что такое Yii 2.0?

  • PHP 5.4+.
  • Сбалансированный.
  • Стабильный с 12 октября 2014 и поддерживаемый.
  • Лицензирован под BSD.
  • Решает все основные задачи веб-разработки.
  • REST API framework.
  • Инструменты для отладки.
  • Генерация кода.
  • Очень приятная работа с данными.
  • Хорошая документация и дружелюбное сообщество.
http://slides.rmcreative.ru/2014/yii2-rifvrn/

Документация

Сообщество

Планы

  • 2.0.1
  • Новый сайт
  • 1.1++

Как перейти с 1.1 на 2.0

  • Просто — никак.
  • А стоит ли?
  • Если да — переписывать или портировать.

Практика!

Hello world

composer global require "fxp/composer-asset-plugin:1.0.0-beta3"
composer create-project --prefer-dist yiisoft/yii2-app-basic helloworld
  • Контроллер
  • View
  • Передаём данные
Profit?

Как это работает

MVC

  • Модель
  • View
  • Контроллер
  • Что куда?

Компоненты

  • Yii::$app->
  • не всё обязано быть компонентом
  • Object
  • Если ничего не надо, просто не наследоваться

Свойства

  • Геттеры-сеттеры
  • Конфиг

События

  • Локальные
  • Глобальные
  • Зачем?

Алиасы

  • Что это такое?
  • URL и файлы
  • Стандартные
  • Алиасы расширений
  • bower / npm

Автозагрузка классов

Сервис-локатор

  • Реестр.
  • Для чего? Отложенная загрузка, единственные экземпляры, ...
  • Yii::$app

DI контейнер

  • Объект, который знает как создать и настроить другие объекты и их зависимости.
  • Для чего?
  • Yii::$container, Yii::createObject

Делаем витрину

Сделаем витрину для магазина. Магазином называть не будем потому как платежи не принмиаем и за наличием товаров не следим.

Формируем требования

  • А будет ли магазин? Чаще это витрины :)
  • А не сделать ли ещё и X?

Важно быть на одной волне с владельцем бизнеса

  • У него всегда видение шире!
  • DDD

Оцениваем время

  • Раскидываем по задачкам: Trello, Pivotal.
  • Оцениваем каждую.
  • Суммируем.
  • Запас ×1.5+

ставим advanced

Навёрстываем минимальный 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

Основы

  • Консолька
  • SmartGit

Как организовать работу?

Как ветвиться?

Полезняшки

  • git pull --rebase
  • git bisect
  • hub

Вот теперь можно подключать команду к коду...

  • Почему только сейчас?

Каталог

  • Leveled list
  • Выбираем одним запросом, строим рекурсивно
  • Редактор простой по одной категории

Загрузка картинок

  • Не сохраняем отдельные файлы
  • Валидация
  • Конвертация

Разметка

  • markdown
  • HTMLPurifier

Валидация и формы

О работе в команде

  • Доверие
  • коммуникация
  • обещания
  • сроки
  • незаменимость
  • иерархия

Корзина

  • Добавить
  • Удалить
  • Изменить количество (+/-)
  • Заказать

Сессии

  • В базу писать не надо
  • Как сохранить корзину надолго?

Куки

  • Мало места?
  • Кука + база
  • order: status, secret
  • Чистим кроном

Не AR-формы

  • Форма заказа

Итерации и ревью

  • Как часто?
  • Правила?

Заказ

email

  • При помощи Yii
  • Отдать на внешку??? Внешние API
  • dkim, spf

События

  • Как выкинуть
  • Как прицепиться
  • Глобальный диспетчер

Мусор в проекте

  • Почему чистим?
  • Жалко!

Откуда мне знать, что оно всё работает?

Тестирование

  • Не должно напрягать

Что потестить?

  • Юнит - вычисление суммы заказа
  • Заказ

CI

  • Travis
  • TeamCity
  • ...

Сервер

Начальный конфиг

  • nginx + php-fpm
  • PHP 5.6
  • MariaDB

Автоматизация (или полуавтомат)

  • Деплой с APC

Ошибки

  • Локальные
  • На продакшне

Логирование

  • Фильтры
  • Цели

Внешние сервисы

  • Почему не email, jabber?
  • https://github.com/getsentry/sentry
  • Rollbar

Допиливаем

Ускоряем

production-конфиг

  • init
  • YII_DEBUG = false
  • Кеш

Инструменты

  • debug toolbar
  • XDebug
  • XHProf
  • Pinba

Масштрабирование

  • round robin
  • Разделяем по серверам
  • Репликация БД

i18n

Сообщения

  • yii message
  • message source
  • Исходный язык английский
  • ICU

Данные

Всегда по-разному. Пример?

Красивые URL

  • Как настроить

Как оно работает?

  • Роуты
  • Порядок
  • Регулярки

Свой Rule

  • Дополним базу алиасом
  • Генерация алиаса по title
  • Своё правило

Безопасность

Общие принцыпы

  • filter input
  • escape output

Пароли

  • md5
  • sha1
  • Соль
  • bcrypt

Yii

  • SQL injection
  • XSS
  • CSRF

RBAC

  • Что такое?
  • Как работает?
  • закрываем админку

REST API

Быстрый старт

Выдача токена

  • Отдельный action
  • Передача хеша?

Фильтр полей

Вопросы?