Html — Вопросы по Yii2


Содержание

Рекомендации по работе с Yii 2

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

Бизнес-логика

    Модели ActiveRecord должны описывать структуру данных таблиц в базе данных;

Бизнес-логике не место в ActiveRecord, контроллере и тем более в представлении. Размещать бизнес-логику необходимо в отдельных классах с говорящими названиями “СущностьДействие”. В результате получаются “худые” контроллер и ActiveRecord. Данный подход повышает читабельность проекта в разы, а также позволяет производить тестирование бизнес-логики.

  • Не рекомендуется использовать beforeSave , afterSave , beforeFind , afterFind в ActiveRecord для тяжелой бизнес-логики (например, запросы к сторонним ресурсам, парсинг Excel, тяжелых XML файлов и т.д).
  • Не рекомендуется размещать любую бизнес-логику в классах ActiveRecord.
  • Миграции в базе данных

    1. Категорически запрещено вносить изменения в структуру базы данных, а также добавлять/изменять/удалять данные в таблицах auth_item и auth_item_child в обход миграций. Все обновления в БД осуществляются только посредством оформления миграции.
      1. Все изменения данных, которые необходимо произвести единожды у всех участников проекта, необходимо реализовывать через миграции;
      2. Если изменения данных в БД необходимо производить с некой периодичностью, следует вынести такие изменения в консольное приложение.
        На практике встречаются случаи, когда разработчик размещает функционал, который более подходит для консольного приложения либо для миграций, в контроллер веб приложения, что недопустимо.
    2. Категорически запрещено изменять старые (уже попавшие в Git) миграции даже при условии, что вы работаете в отдельной ветке. Для внесения правок необходимо готовить новую миграцию.
      Данным пунктом можно пренебречь только в одном случае, если старая (уже попавшая в Git) миграция заведомо содержит ошибки/баги, и вносимые изменения направлены на устранение этих самых ошибок/багов.
    3. Категорически запрещено использовать в миграциях: модели, конфигурацию или любые другие элементы из основного проекта. Миграция должна быть самодостаточной сущностью и может использовать только методы, унаследованные от yii\db\Migration .
    4. Если необходимо сделать SELECT в миграции, используем класс yii\db\Query .
    5. Для MySQL используем движок InnoDB, так как он предоставляет полезные функции, например, такие как транзакции и внешние связи.
    6. Если в проекте используется СУБД MySQL для использования внешних ключей (Foreign keys) и транзакций, в качестве системы хранения данных (Storage engine) должна быть выбрана InnoDB. При создании таблицы в БД необходимо использовать следующую конструкцию:

    7. Метод down() в миграциях обязателен к реализации, если миграция является обратимой. Нежелательно, чтобы метод down возвращал false .
    8. Перед публикации миграций в Git необходимо обязательно убедиться в том, что миграции исправно накатываются и откатываются php yii migrate/redo n .
    9. Для добавления нескольких записей в базу данных стоит использовать batchInsert() вместо конструкции, когда вызывается insert() в цикле (то же касается и консольных алгоритмов).
    10. При получении большого количества данных следует использовать методы batch() , each() вместо all() (то же касается и консольных алгоритмов).
    11. В платформе TaskOn 2 обязательно используется шаблон при именовании таблиц в миграциях: <<%table_name>> . Это даст возможность использовать префиксы таблиц в БД. При использовании данного шаблона не забудьте применить следующий пункт в кодогенераторе Gii при генерации модели:
    12. Указывать длину столбца не обязательно, если она является значением по умолчанию для этого типа данных.

    Структура базы данных

    1. Наименование таблиц и столбцов в БД.
      1. Необходимо убедиться в том, что имя уникально и его нет в списке зарезервированных ключевых слов ANSI SQL (92, 99 and 2003), MySQL версий с 3, PostgreSQL 8.1, MS SQL Server 2000, MS ODBC и Oracle 10.2.
      2. Названия таблиц должны быть в единственном числе. Исключением являются слова в английском языке, у которых нет формы единственного числа (например: “news”).
      3. В именах необходимо использовать только буквы, цифры и символ подчеркивания.
      4. Необходимо избегать нескольких подряд идущих символов подчеркивания.
    2. Индексы.
      1. Не стоит забывать об индексах уникальности (UNIQUE INDEX) для того, чтобы избежать переполнение таблицы дубликатами.
      2. Если по определенному полю очень часто происходит выборка, ему необходимо добавить индекс (INDEX).
      3. Если запрос содержит много запросов JOIN, вам необходимо убедиться, что столбцы, к которым вы присоединяетесь, индексируются в обеих таблицах. Это влияет на то, как MySQL внутренне оптимизирует операцию соединения.

    Кеширование и переиспользование данных

    1. Кэшировать нужно данные, которые медленно генерируются и часто запрашиваются.
    2. Помимо внешнего кэширования данных (в файловом хранилище, Memcached, и т.д), во многих случаях необходимо кэшировать промежуточные результаты выполнения некоторых операций в рамках жизненного цикла приложения. В качестве:
      1. переменных;
      2. синглтон-классов;
      3. статических свойств класса;
      4. свойств компонентов Yii.

    Представления

    1. Название представления стоит начинать с символа нижнего подчеркивания “_” в случае, если представление рендерится без layout. Например:
      1. _header;
      2. _footer.
    2. Категорически запрещено размещать js/css внутри представления, если оно не будет использоваться в качестве шаблона писем или для дальнейшей генерации pdf, image и т.д.

    3. Категорически запрещено выполнять запросы в базу данных из представления.
    4. Не стоит в представлении производить всю верстку с помощью “оберток” типа Html::tag() , Html::beginTag() , Html::endTag() . За счет этого html верстка становится нечитабельной и нет никакой подсветки html тегов.

    Рекомендации по оформление кода в приложениях Yii 2

    Общие положения

    1. Имена методов, свойств и переменных должны быть объявлены с использованием т.н. «camelCase» (первое слово пишется в нижнем регистре, далее каждое слово начинается с большой буквы, а между словами нет разделителей).
      Данный пункт не имеет никакого отношения к виртуальным атрибутам ActiveRecord.
    2. Открывающая фигурная скобка в определении класса или метода должна располагаться на новой строке, а закрывающая фигурная скобка должна располагаться на следующей строке после тела класса/метода.
    3. Одиночный знак подчеркивания в начале имени свойства или метода не следует использовать как признак защищенной (protected) или приватной (private) области видимости.
    4. Открывающая фигурная скобка в управляющих конструкциях должна располагаться в той же строке, что и сама конструкция, а закрывающая фигурная скобка должна располагаться на следующей строке после тела конструкции.
      p
    5. Пустые строки могут быть добавлены в код для повышения удобочитаемости и разделения блоков кода.
    6. В одной строке не должно быть более одного выражения.

    Классы

    1. Каждый класс должен располагаться в отдельном файле.
    2. Имена классов должны быть объявлены с использованием так называемого «StudlyCaps» (каждое слово начинается с большой буквы, между словами нет разделителей).

    Константы

    1. Константы классов должны быть объявлены исключительно в верхнем регистре с использованием символа подчеркивания для разделения слов.
    2. Константы PHP true, false и null должны быть написаны в нижнем регистре.

    Свойства

    1. Область видимости должна быть явно указана для каждого свойства.
    2. В одном выражении не должно быть определено более одного свойства.

    Методы

    1. Метод должен служить одной четко определенной цели, эта цель должна быть полностью отражена в его имени, например: получить текущего пользователя — getСurrentUser() .
    2. Метод не должен иметь слишком большое количество параметров.
    3. Параметры следует упорядочивать по степени их важности либо по порядку их использования внутри метода.
    4. Список аргументов может быть разделен на несколько строк, каждая из которых дополнена слева одним отступом (четырьмя пробелами). В таком случае первый элемент списка аргументов должен начинаться с новой строки, и в каждой строке должен быть указан только один аргумент.
    5. Область видимости должна быть явно указана для каждого метода.

    Переменные
    Переменная должна наиболее полно описывать представляемую сущность, это значит, что она должна иметь понятное название, по которому можно судить о ее предназначении.

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

    Комментирование — важный аспект разработки приложений на Yii 2. Игнорирование создания понятных комментариев отнимает значительно большего времени при поддержке и командной разработке проектов. Ниже мы привели основные нюансы простановки комментариев в коде, чтобы на выходе можно было сгенерировать удобную и понятную документацию по проекту.

    Область комментирования

    1. В ходе написания кода комментарии описывают константы, методы, классы, свойства интерфейсов.
    2. В коде разрешено комментировать тремя способами:
      1. Для добавления комментария 1 строкой — //;
      2. Для комментирования нескольких строк- /_/ ;
      3. В формате PHPDoc (для описания классов, свойств, методов, констант, интерфейсов).

    Обратите внимание, что комментарий типа # не используется. Это связано с тем, что на основании оставленных комментариев генерируется документация к разрабатываемому программному продукту.

    Порядок составления комментария

    1. Комментарий формируется в следующей последовательности:
      1. класс;
      2. константа;
      3. свойство;
      4. метод.
        Пример формирования комментария “Класс”:
    2. Необходимо описывать виртуальные свойства класса. Свойства начинаются с символа @ с добавлением слова «property». Это сильно облегчает написание кода на PHP в IDE PHPStorm.
    3. Используйте @mixin для подключенных поведений к классу для того, чтобы PHPStorm знал о методах, реализованных в этих поведениях: Далее описываются константы, если есть, и записываются в верхнем регистре: При описании свойства необходимо задать тип данных через @var и дать описание: Описание статических свойств: Методы могут содержать комментарий родительского метода класса. Это характерезуется @inheritdoc параметром. Пример ниже говорит о том, что у метода уже есть комментарий. Читай комментарий родительского метода.

    Требования к комментариям в коде

    1. Комментарий не должен содержать сленговых выражений типа — “юзер”, “штука”, “фигня”, “хрень”, “непонятная вещь”, “задолбался это писать” и т.д.
    2. Комментарий не должен содержать матерных и других неприличных выражений, так как на основе оставленного комментария генерируется документация.
    3. Обязательно необходимо вставлять PHPDoc комментарий передаваемого параметра из «контроллера» в «вид». Обычно такие коментарии встречаются в начале файла /** @var \common\modules\content\models\Post $model */
    4. Обязательно необходимо описывать с помощью PHPDoc комментариев переменные, передаваемые в анонимные функции (Closures) в случае, если тип переменной не описан явно:
    5. В случае явного описания типа переменной в PHPDoc комментарии нет необходимости:

    Рекомендации к комментированию кода

    1. Не нужно комментировать очевидные вещи.

    2. Если код использует стандартные функции, конструкции или классы языка, то не тратьте свое время на его комментирование, в данном случае поможет правильно оформленный код.

    Комментарии к полям (столбцам) таблиц БД

    Во время проектирования таблиц БД необходимо добавлять комментарии для полей таблиц:

    Компонент gii во фреймворке Yii2 позволяет генерировать AR модели для таблиц БД. Установив галочку “Generate Labels from DB Comments”,

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

    А также название полей появятся в веб-приложении для администрирования СУБД.

    Полное руководство по Yii 2.0

    Качественное официальное руководство

    • Главная
    • Блог
    • Полное руководство по Yii 2.0

    Изучайте Yii2 по руководству от разработчиков. Очень грамотная документация, которая обновляется и дополняется вместе с обновлениями фреймворка:

    На 19.02.2020 оно таково:

    Введение

    Yii – это высокопроизводительный компонентный PHP фреймворк. Подходит для разработки всех типов веб-приложений: порталы, форумы, CMS, магазины или RESTful-приложения. Yii отлично расширяем и производителен. Есть сейчас 2 версии Yii — Yii 1.0 и Yii 2.0. Чтобы узнать подходит ли ваш хостинг для Yii, просто запустите скрипт проверки требований (он поставляется в каждом релизе Yii 2)

    Обновление нетривиально, так как Yii 2 полностью переписан и нужно кропотливо копаться в коде, обновляя его под новую ветку фреймворка.

    Первое знакомство

    Установить Yii можно 2 способами: используя composer (предпочтительно) или скачав архив. Также можно установить basic или advanced шаблон, соответственно для простого и более продвинутого приложения.

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

    Здесь показано как создать страницу с надписью «привет». Учимся создавать действие контроллера и представление.

    Учимся получать данные от пользователя. Делаем форму с полями имя пользователя и email. Потребуется создать модель, объявить правила проверки введённых данных.

    Настраиваем подключение к БД. Определяем класс Active Record. Запрашиваем и отображаем данные.

    Базовый код можно генерировать в Yii автоматически. Активируем Gii, создаём Active Record класс с помощью Gii. Генерируем код для реализации CRUD для таблиц БД. Настраиваем код, сгенерированный Gii.

    Изучайте документацию: подробное руководство, описание классов, вики-статьи и книги. Расширения. Сообщество.

    Структура приложения

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

    Это первое звено в процессе начальной загрузки приложения. Входные скрипты для веб-приложений — index.php, для консольных приложений — yii.php

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

    Html — Вопросы по Yii2

    В Yii 2 существует набор HTML-хелперов, которые помогают сгенерировать строку URL или полную ссылку в виде тега .

    Подключается хелпер так:

    Посмотреть, какие методы поддерживает данный хелпер, можно на странице:

    Генерация ссылки в виде тега

    Здесь видно, что вторым параметром можно передавать как строку, так и массив. Правила по которым генерируется URL из массива приведены в следующем разделе.

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

    Более подробная документация по этому методу:

    Генерация строки Url

    Второй параметр метода Html::a(), на самом деле, внутри реализации, передается в хелпер Url::to(), и результат его обработки помещается в атрибут href тега . Расположен этот хелпер в следующем пространстве имен:

    Данное пространство имен имеет смысл подключать, если необходимо именно генерировать строку URL.

    Здесь показаны различные варианты вызова этого хелпера:

    echo Url::to([‘site/index’, ‘src’ => ‘ref1’, ‘#’ => ‘name’]);

    // /index.php?r=post%2Findex — assume the alias «@posts» is defined as «/post/index»

    // the currently requested URL

    echo Url::to(‘@web/images/logo.gif’, true);


    echo Url::to(‘@web/images/logo.gif’, ‘https’);

    Документация по этому методу находится здесь:

    Знаете ли вы, что:

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

    Yii2. Gii — генерирование кода

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

    Чтобы облегчить эту задачу, современные фреймворки предлагают инструменты для генерирования такого кода. Во фреймворке Yii2 таким инструментом является Gii. Это ничто иное, как модуль, который можно настроить в конфигурации фреймворка, а конкретнее, в файле config\web.php :

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

    Здесь можно выполнить целый ряд операций: создать модель, контроллер и виды (приложение CRUD), можно генерировать формы, модули и расширения. Очень удобный инструмент, который поможет в считанные минуты сгенерировать типовое приложение.

    Теперь попробуем этот инструментр в работе. Создадим базу данных catalog и две таблицы — category и product :

    Для начала создадим модель в блоке Model Generator. Здесь достаточно лишь начать вводить имя таблицы, с которой будет работать данная модель. Yii при начале ввода сразу же подскажет имя возможной таблицы. После этого кликаем по полю Model Class и фреймворк сам подставит нужное имя класса модели — Category . Остается нажать кнопку Preview и на следующей странице нажать кнопку Generate.

    В результате будет создан файл models/Category.php :

    Теперь перейдем к генерированию CRUD приложения, выбрав в меню пункт CRUD Generator. Здесь укажем класс модели и контроллера, этого пока будет вполне достаточно.

    • Model Class: app\models\Category
    • Controller Class: app\controllers\CategoryController

    После этого жмем кнопку Preview и на новой странице кнопку Generate:

    Класс контроллера CategoryController :

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

    Yii2. Тестирование для новичков

    Главная >> Linux >> Yii2. Тестирование для новичков

    Yii2. Тестирование для новичков

    Тестирование — неотъемлемый и неминуемый процесс для разработчиков. Честно говоря, долгое время сам обходился без него — делал серьезные, большие проекты, но постоянно на продакшне натыкался на одни и те же грабли — сообщения и звонки «Вот это не работает», при том что «Вчера все работало, как надо», а правок никто не вносил.

    Эти ситуации связаны с множеством аспектов, каких-то неучтенных, элементарных мелочей, нелогичных действий пользователей на сайте и т.д. В общем, кратко говоря — тестирование наше все. Только правильно написанные тесты способны уверить Вас, что Ваша работа сделана правильно и качественно.. А это — залог хорошего сна программиста :).

    Итак, начнем. Этой статьей я начинаю цикл статей по тестированию — все манипуляции я буду проводить, конечно же, на базе любимого Yii2.

    Лучшее в мире тестирования — это codeception, поддержка которого, конечно же, присутствует и в Yii (к слову говоря 1 и 2 версии).

    Глобальная установка codeception

    Устанавливать будем через Composer. Что это такое, зачем он нужен и как с ним работать я писал ранее.
    Выполните в терминале следующие команды. Они глобально установят codeception.

    Yii2. Gii — генерирование кода

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

    Чтобы облегчить эту задачу, современные фреймворки предлагают инструменты для генерирования такого кода. Во фреймворке Yii2 таким инструментом является Gii. Это ничто иное, как модуль, который можно настроить в конфигурации фреймворка, а конкретнее, в файле config\web.php :

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

    Здесь можно выполнить целый ряд операций: создать модель, контроллер и виды (приложение CRUD), можно генерировать формы, модули и расширения. Очень удобный инструмент, который поможет в считанные минуты сгенерировать типовое приложение.

    Теперь попробуем этот инструментр в работе. Создадим базу данных catalog и две таблицы — category и product :

    Для начала создадим модель в блоке Model Generator. Здесь достаточно лишь начать вводить имя таблицы, с которой будет работать данная модель. Yii при начале ввода сразу же подскажет имя возможной таблицы. После этого кликаем по полю Model Class и фреймворк сам подставит нужное имя класса модели — Category . Остается нажать кнопку Preview и на следующей странице нажать кнопку Generate.

    В результате будет создан файл models/Category.php :

    Теперь перейдем к генерированию CRUD приложения, выбрав в меню пункт CRUD Generator. Здесь укажем класс модели и контроллера, этого пока будет вполне достаточно.

    • Model Class: app\models\Category
    • Controller Class: app\controllers\CategoryController

    После этого жмем кнопку Preview и на новой странице кнопку Generate:

    Класс контроллера CategoryController :

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

    Полное руководство по Yii 2.0

    Качественное официальное руководство

    • Главная
    • Блог
    • Полное руководство по Yii 2.0

    Изучайте Yii2 по руководству от разработчиков. Очень грамотная документация, которая обновляется и дополняется вместе с обновлениями фреймворка:

    На 19.02.2020 оно таково:

    Введение

    Yii – это высокопроизводительный компонентный PHP фреймворк. Подходит для разработки всех типов веб-приложений: порталы, форумы, CMS, магазины или RESTful-приложения. Yii отлично расширяем и производителен. Есть сейчас 2 версии Yii — Yii 1.0 и Yii 2.0. Чтобы узнать подходит ли ваш хостинг для Yii, просто запустите скрипт проверки требований (он поставляется в каждом релизе Yii 2)

    Обновление нетривиально, так как Yii 2 полностью переписан и нужно кропотливо копаться в коде, обновляя его под новую ветку фреймворка.

    Первое знакомство

    Установить Yii можно 2 способами: используя composer (предпочтительно) или скачав архив. Также можно установить basic или advanced шаблон, соответственно для простого и более продвинутого приложения.

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

    Здесь показано как создать страницу с надписью «привет». Учимся создавать действие контроллера и представление.

    Учимся получать данные от пользователя. Делаем форму с полями имя пользователя и email. Потребуется создать модель, объявить правила проверки введённых данных.

    Настраиваем подключение к БД. Определяем класс Active Record. Запрашиваем и отображаем данные.

    Базовый код можно генерировать в Yii автоматически. Активируем Gii, создаём Active Record класс с помощью Gii. Генерируем код для реализации CRUD для таблиц БД. Настраиваем код, сгенерированный Gii.

    Изучайте документацию: подробное руководство, описание классов, вики-статьи и книги. Расширения. Сообщество.

    Структура приложения

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

    Это первое звено в процессе начальной загрузки приложения. Входные скрипты для веб-приложений — index.php, для консольных приложений — yii.php

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

    «Рецепты для Yii 2»

    PHP Developer — HiQDev, Yii

    Большинство сегодняшних тем достойны отдельных больших докладов

    Цели на сегодня:

    • узнать больше о возможностях Yii 2
    • научиться организовывать структуру проекта
    • рассмотреть ошибки и научиться их избегать
    • узнать хорошие решения для типичных задач
    • найти для себя что-то новое и полезное

    О PHP в целом

    PHP развивается

    • новый синтаксис (. , group use)
    • новые возможности (anonymous classes, return type declaration)
    • крутое ускорение
    • рост сообщества

    . а проблемы остаются:

    • рост количества кода ≠ росту качества кода
    • код постоянно меняется
    • переусложнение кода
    • обратная совместимость
    • серебренная пуля так и не найдена

    код может стать плохим

    «Все проблемы программирования можно решить дополнительным слоем абстракции… кроме проблемы избыточной абстракции» David Wheeler

    Мы все стремимся

    • писать хорошо читабельный и легко поддерживаемый код
    • использовать актуальные технологии
    • получать удовольствие от работы

    Хорошим инструментом приятно работать!


    Но нужно уметь.

    Yii 2 — MVC фреймворк

    • модель
    • представления
    • контроллеры

    M в паттерне M VC — модель

    Модель в Yii (и не только) — класс, описывающий структуру таблицы

    По MVC, бизнес-логика относится к модели

    Кладём всю логику в модели, которые описывают структуру таблиц!

    На таком MVC далеко не уедешь

    • Раздутые модели
    • Бизнес-логика размазана
    • Копи-паста
    • Тестировать сложно
    • Трогать опасно
    • Жить больно

    Разбираемся!

    Модели в фреймворке

    • Представляют структуры данных:
      • таблицы и связи (ActiveRecord)
      • формы
      • запросы к API
    • Содержат сценарии и правила валидации
    • Не содержат бизнес-логику

    Модель в MVC

    • Не один класс! Это целый доменный слой!
    • Содержит бизнес-логику
    • Содержит модели (таблиц, форм, . )

    Так куда именно писать бизнес-логику?

    • В модели (таблиц, форм, . )
    • В контроллеры
    • Размазать тонким слоем по всему коду
    • В отдельные классы со статическими методами
    • В отдельные классы

    Отдельные классы для бизнес-логики — это:

    • Строгая зона ответственности
    • Место для всей грязной логики
    • Внедрение зависимостей (DI)
    • Интерфейсное взаимодействие

    Куда класть и как называть


    • Не боимся создавать директории и пространства имён
    • Создаём директорию в src модуля/приложения
    • Называем классы по сути действия — СущностьДействие

    Нужен пример.

    Давайте удалим пользователя :)

    Класс бизнес-логики ClientDeleter
    ClientController

    На выходе получим:

    • Тонкий контроллер
    • Тонкую модель
    • Тестируемый в изоляции класс логики
    • Готовность к повторному использованию
    • Возможность переопределения и дополнения
    • MVC
    • DI
    • сервис-локатор
    • компоненты
    • модули
    • фильтры
    • виджеты
    • хелперы
    • ассеты
    • .

    Ещё немного о моделях

    • Описываем ENUM-типы — константами (STATE_ENABLED, TYPE_PARTNER)
    • Не работаем с $_GET, $_POST, etc
    • Не генерируем HTML
    • Перечисляем используемые сценарии в константах (SCENARIO_CREATE)
    • При необходимости, переопределяем load()
    • Не создаём модели, если они мешают (отчёты, статистика)
    • Не раздуваем

    Переопределяем класс ActiveQuery

    Описываем хитрые или уточнённые связи прямо в модели

    • HTML
    • Минимум логики
    • Не делает запросов в БД
    • Не запрашивает и не изменяет данные
    • Получает данные от контролера
    • Разделять большие вьюхи на части
    • Сложный HTML с логикой оформлять в виджеты

    Controllers & Actions

    • Обрабатывают действия
    • Создают и наполняют модели
    • Не генерируют HTML (рендерят вьюхи)
    • Не содержат голый SQL
    • Не содержат бизнес-логику (вызывают её)

    Переиспользуемые экшены

    • Унификации стандартных действий
    • Отдельностоящие классы
    • Декларативное описание
    • Легче тестировать
    • Сложность локального изменения поведения

    Компоненты

    • Регистрация в конфигурации приложения
    • Доступ через Yii::$app->componentName
    • Один класс – много компонентов
    • Никаких синглтонов
    • Много встроенных компонентов
    • Большой выбор компонентов в Open-Source
    • Можно переопределять и дополнять

    Встроенные компоненты

    • request – представление запроса от клиента
    • response – представление ответа
    • session – хранилище данных сессии
    • urlManager – парсинг и генерация URL
    • db – работа с БД
    • formatter – форматирование дат, времени, др. величин
    • i18n – интернационализация
    • log – цели логирования
    • и другие .

    Пишите компонент, когда:

    • Конфигурация на уровне приложения
    • Нужно один раз инициализировать
    • Хочется написать синглтон

    Работа с внешними данными

    Helpers

    • Класс со статическими методами
    • Замена функций и их группировка
    • Когда не нужна конфигурация на уровне приложения
    • Преобразование данных
    • Переопределение наследованием

    Встроенные хэлперы:

    • StringHelper – манипуляции со строками
    • ArrayHelper – манипуляции с массивами
    • Html – генерация HTML
    • Json – работа с JSON

    • и другие.

    Виджеты

    • Вьюхи с логикой в ООП-стиле
    • Борьба с копи-пастой во вьюхах
    • Хороши для повторно-используемых элементов: кнопки, таблицы, цельные компоненты вёрстки
    • Приятно тестировать

    Behaviors

    • По сути — миксины
    • Добавление к классу свойств и методов без изменения класса
    • Подключение слушателей событий
    • Переехали из Yii 1, когда трейтов не было
    • Не содержат бизнес-логики

    Где пригодится

    • Преобразование или дополнение данных в моделях
    • Проверка прав доступа перед выполнением действия
    • Автоматизация логирования

    FileBehavior Вешать слушателей на события

    Преимущества Behavior’ов над Trait’ами

    • статическое и динамическое прикрепление
    • возможность наследования
    • настройка поведения
    • возможность тестирования

    Было очереди на выпиливание, но под большим вопросом

    Недостатки Behavior’ов

    • Медленнее, чем Trait’ы
    • Не будет подсветки в IDE

    Модули

    Могут объединять всё: контроллеры, модели, вьюхи, компоненты, виджеты, etc.

    • Группировка похожих функций приложения
    • Изоляция функций для их последующего использования в других проектах

    Изоляция — проблема Пример модуля (корзина)

    • Хоть и Role Based, проверяем Permission
    • Детализация прав доступа по необходимости – YAGNI
    • Используем фильтр AccessControl

    Миграции

    • Единственный железный способ поддержания актуальности
    • Абстрактно от БД и среды
    • Легко пишутся
    • Тестируемы

    Миграции применимы для

    • Создания и изменения структуры БД
    • Наполнение и конвертации таблицы
    • Управления RBAC

    i18n — internationalization

    • Исходный язык – английский
    • Делаем специализированные словари
    • Называем их осмысленно
    • Используем генерацию словарей из кода
    • Не пользуемся машинным переводом

    Yii::t() умеет форматировать:

    Пишем выражения правильно

    Last update: 07/31/2020

    Плохо:

    • Склонение
    • Падежи
    • Последовательность слов
    • Формат даты

    Хорошо:

    Как быть с HTML

    Больше про i18n в докладе
    Yii and PHP i18n & L10n Александра Макарова

    Yii2 basic: Пишем и запускаем тесты с Codeception

    В этой записи, мы обсудим тестирование в Yii2 basic с помощью Codeception и почему это пригодиться.

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

    Codeception

    В Yii2 используется Codeception как framework для тестирования.

    Codeception — это отдельный проект, не зависящий от Yii2, который используется во многих современных framework’ах (Symfony, Laravel и др.). И конечно же, вы можете установить Codeception используя Composer.

    Структура тестов, папка tests и её содержимое

    Для написания тестов, существует специальная папка tests .

    Если вы в неё зайдет, то увидите следующую структуру:

    • _data — это папка, в которой хранятся PHP файлы возвращающие массив данных (например, автомобили) для использования в fixtures . fixtures класс по типу ActiveRecord, который перед запуском теста, добавляет данные из файла, в заранее указанную таблицу из ActiveRecord основного класса (используя параметр $modelClass , например, fixtures/Car.php , будет ниже в примере). После того как тест будет завершен, все данные из этой таблицы будут удалены. И так процесс будет повторяться.
    • _output — это папка, в которой выводится результат запуска функциональных тестов. Выглядят они как исходный код HTML странички. Например, если вы зайдете на страницу и посмотрите на неё с помощью инспектора кода, в этом случае вы увидите тоже самое.
    • _support — это сгенерированные модули, которые нужны для запуска тестов. Они создаются с помощью команды ( vendor/bin/codecept build tests/ )
    • bin — это папка, в которой находится бинарный файл (yii), на подобии того, что лежит в корне, только этот именно для запуска процессов в тестовом режиме.
    • acceptance — это папка, в которой находятся файлы со сценарием со стороны пользователя, эмулируя поведение браузера
    • functional — это папка, в которой находятся файлы со сценарием со стороны пользователя, эмулируя поведение браузера
    • unit — этот папка с файлами, в которых проверяются классы или часть кода на то, что он/они работает по определенному сценарию или без сценария

    Запуск тестов

    В Yii2 по умолчанию присутствуют некоторые тесты запустить тест и чтобы их запустить — используйте команду ниже:

    Если у вас выдает следующую ошибку:

    Тогда её можно исправить установив php-gd расширение:

    • Для php 5.5+: $ sudo apt-get install php5-gd
    • Для php 7+: $ sudo apt-get install php7.0-gd

    И теперь снова попробуйте запустить тесты, у вас должно вывестись что-то похожее на это:

    Собственные тесты для класса Car

    Теперь пришло время написать собственные тесты. У нас есть класс Car , у которого уже есть свой controller и action’ы. Тем самым, чтобы нам каждый раз не проверять работает добавление машины или нет, мы можешь запускать тесты, которые сделают все повторяющуюся работу за нас.

    Обратите внимание, что я буду рассматривать только unit тесты для тестирования модели Car. Если вам нужно проверять как это работает на клиентской части (контроллеры, доступна страница или нет) — используйте functional и acceptance тесты. Functional используется больше для тестирования API, где acceptance использует настоящий браузер (например, Firefox) — что в точности эмулирует настоящего клиента.

    Список unit тестов, который мне пришел на ум:

    • добавление новой машины
    • могу ли я добавить машину не заполняя все поля формы
    • удаление существующей машины
    • изменение существующей машины

    Для этого мы создадим новый тест формата — unit .

    Сделаем это через консоль:

    • generate:test — хотим создать новый тест
    • unit — тип теста
    • models/Car — models — это папка, внутри unit папки, и Car — это название теста

    После создания теста, у вас должно написать следующее сообщение:

    Это означает, что тест был успешно создан. Обратите внимание, что к введенному Car был автоматически добавлено «Test». В итоге, у нас получается следующее название файла CarTest.php внутри tests/unit/models .

    Файл должен содержать следующее:

    Внутренность файла по умолчанию может измениться со временем, поэтому не пугайтесь, если у вас что-то выглядит по другому.

    • $tester будет использоваться для обращения к тестеру (виртуально созданному тестировщику — он создается при каждом запуске теста). У него так же есть функции помощники (управления fixture’ами и другие (то есть загружать нужную таблицу данными), о них чуть позже).
    • before() мы будем использоваться для того, чтобы объявить какие-либо данные перед запуском тестов. Например загрузить fixtures , которые я ранее описывал. Сейчас нам нужно будет создать новый файл в папке _data .

    Назовите файл cars.php и добавьте туда следующее:

    Этот файл будет подгружаться каждый раз когда будем запускать CarTest.php . Файл cars.php представляет из себя обычный массив, но на самом деле — он будет добавлен в таблицу cars в виде обычного SQL, поэтому поля по типу name и model должны совпадать со названиями колонок в таблице. После того как тест завершиться, все данные из таблицы cars удаляться и так процесс будет повторяться. Вы можете добавить безграничное кол-во машин. Я буду использовать всего парочку, потому что больше и не требуется.

    • _after() мы использовать не будем, поэтому его можете удалить.

    Все остальные методы, которые начинаются с testNazvanieMetoda() — это методы, которые будут проверяться во время запуска тестирования. test — это обязательная часть названия метода, иначе он будет проигнорирован и последующие слова — это и есть название теста ( NazvanieMetoda ). testSomeFeature() вы тоже можете удалить, потому что это бесполезный стандартный тест.

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

    Теперь создадим собственные методы для тестов.

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

    У меня получилось следующее:

    • testCreate() — добавление новой машины
    • testCreateEmptyFormSubmit() — могу ли я добавить машину не заполняя все поля формы
    • testDelete() — удаление машины
    • testUpdate() — изменение машины

    Теперь создадим пустые методы для тестов. Наш класс будет выглядеть следующим образом:

    Теперь добавим fixture в метод __before() (которую мы создали в папку _data , файл cars.php ), чтобы перед запуском теста у нас было пару машин, которые мы можем сравнивать с чем-то если нам это понадобиться.

    Так же нужно создать папку fixtures в корне проекта, там где лежат папки models и controllers и другие и внутри создать класс Car.php со следующим содержимым:

    Теперь мы можешь использовать Car fixture, внутри __before() следующим образом:

    Но так же не забудьте добавить fixtures в список зависимостей Codeception в файле unit.suite.yml , который находится в папке tests .

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

    У вас должно вывестись, что-то похожее на это:

    Сейчас если вы запустите тесты:

    То вероятнее всего, что у вас посыпятся следующие ошибки:

    Это ошибка говорит о том, что вы не изменили стандартную базу данных для тестирования в конфиге config/test_db.php :

    Поэтому открываем файл, заменяем yii2_basic_tests на yii_loc_test и сохраняем.

    • Теперь нам нужно зайти в базу данных через phpMyAdmin, открыть yii_loc и сделать «Экспорт».
    • Оставьте «Быстрый» вариант и нажмите «ОК»
    • Скачиваете файл
    • В phpMyAdmin нажмите на логотип, далее на «Базы данных» и введите новое название yii_loc_test
    • Зайдите в только что созданную базу данных и нажмите «Импорт»
    • Выберите файл yii_loc.sql и нажмите «ОК»
    • База должна быть экспортирована

    Теперь попробуйте снова запустить тесты:

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

    Теперь самое время написать логику для наших тестов. Я буду брать метод за методом и расписывать как и почему я его написал именно так.

    Все что мы тут делаем — это создаем новый объект с данными используя класс Car , вносим в него данные машины ( name и model ) и сохраняем. Функция expect_that() (на рус. можно перевести как — «ожидаю что») принимает в себя булевое значение. Она проверяет на правдопобность действия. То есть я жду, что save() вернет true , потому что машина должна быть добавлена. Если в дальнейшем, я что-то подправлю в модели, то этот тест провалиться и я об этом узнаю, потому что я буду запускать тесты каждый раз, когда у меня будут нововведения.

    Этот тест очень простой. Он проверяет разрешает ли модель Car отправлять пустые данные в базу данных ( Car — это не должна делать, потому что такие поля как name и model являются обязательными).

    И тем самым мы ожидаем, что форма не должна пройти проверку expect_not($car->validate()) и что она не должна (на рус. expect_not переводится как «ожидаю, что нет») сохраниться expect_not($car->save()) .

    В этом тесте, вы находим первую запись в таблице — это test1 из tests/_data/cars.php . Сначала ожидаем, что мы найдем машину ( expect_that($car !== null) ) и дальше, что она будет успешно удалена ( expect_that($car->delete()) ).

    В этой тесте нам нужно найти машину, проверить удалось ли нам её найти ( expect_that($car !== null) ), далее поменять ей название, проверить удалось ли нам обновить его ( expect_that($car->save()) ), далее найти машину по обновленному имени и если успешно, значит старое название было изменено на новое ( expect_that($updatedCar !== null) ).

    Послесловие

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

    Разработка на Yii2: Старт

    В данном уроке мы поговорим об установке Yii 2.0, настройкой локальной среды разработки, созданием простого приложения “Hello World”, настройкой удалённой среды для хостинга и диплоингом вашего кода с репозитория на GitHub.

    Установка Yii 2.0

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

    Вы можете найти подробную инструкцию по разработке на официальном сайте; Я же пройдусь по основным шагам, которые нужно предпринять на Mac OS X. У Yii 2.0 есть специальная Инструкция (PDF) и Описание классов, где можно будет разъяснить любой непонятный момент.

    Установка через Composer

    Для работы с Yii2 вам потребуется Composer, популярный менеджер зависимостей для PHP. Если у вас до сих пор данный инструмент не установлен, сделать это можно следующим образом:

    curl -s http://getcomposer.org/installer | php
    mv composer.phar /usr/local/bin/composer

    Установка Yii2

    Теперь, используя Composer можно установить Yii2. Для этого вам потребуется активный аккаунт на Github; зарегистрируйтесь, если ещё этого не сделали.

    Давайте назовём этот проект «hello»:

    /Sites
    composer global require «fxp/composer-asset-plugin:1.0.0-beta2»
    composer create-project —prefer-dist yiisoft/yii2-app-basic hello

    Yii2 предоставляет несколько видов установки в зависимости от того, какое приложение вы хотите в итоге получить: простое или продвинутое. В этом уроке мы создадим простое приложение, которое ставится по умолчанию. В продвинутом шаблоне приложения нам предоставляются фронт-эгд, бэк-энд и средства для работы с консолью, типа как в WordPress есть админка, лицевая часть и фоновые cron задачи.

    Настройка локальной среды разработки

    В качестве среды разработки я использую MAMP для OS X. Убедитесь, что MAMP и БД активированы. Затем создайте ярлык для нашего проекта в каталоге Sites:

    cd /Applications/MAMP/htdocs
    ln -s

    Затем, отправьтесь по адресу http://localhost:8888/hello/web. По идее вы должны увидеть стандартный шаблон Yii2, созданный на Bootstrap 3.x.

    Архитектура Yii-приложения

    Одной из фишек Yii является реализация парадигмы Model View Controller. Она не только позволяет создавать хорошо-структурированные приложения для лучшего понимания кода, но и облегчает кучу задач, которые на чистом PHP довольно-таки трудновыполнимы. К примеру обеспечение безопасности и автоматическая генерация кода. Благодаря Yii наш код можно с лёгкостью расширять и многоразово использовать.

    В Yii приложении все запросы осуществляются к файлу: /web/index.php . В нём происходит инициализация Yii, загрузка всех зависимостей и запуск приложения.

    По умолчанию происходит запуск метода Index /controllers/SiteController.php :

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

    По умолчанию Yii выводит содержимое общего шаблона /views/layouts/main.php и шаблона страницы /views/site/index.php . В main.php описана общая для всех страниц HTML/CSS структура. Там же, в main.php происходит вывод контента определённой страницы:

    Переменная $content будет заменена сгенерированным кодом из файла /views/site/index.php .

    Создание Hello World!

    Преобразуем URL

    Для начала давайте изменим вид наши URL, активировав mod_rewrite. На главной странице кликните на пункт меню About. URL будет такого вида http://localhost:8888/hello/web/index.php?r=site%2Fabout. Мы хотим видеть что-то вроде этого http://localhost:8888/hello/web/site/about.

    В каталоге config можно найти файлы конфигурации приложения для веб-версии, консоль-версии и настройки БД. Откройте /config/web.php и добавьте секцию urlManager с массивом настроек:

    Затем в папке с index.php создайте файл .htaccess с следующим содержимым:

    Убедитесь, что на вашем локальном сервере активирован mod_rewrite .

    Если все условия соблюдены, то теперь до вышеупомянутой страницы мы можем достучаться по адресу: http://localhost:8888/hello/web/site/about.

    Создаём метод, который “скажет” Hello World!

    Далее давайте добавим в наш контроллер экшн Say , который будет выводить на экран строку, переданную в параметрах. Добавляем код в /controllers/SiteController.php :

    Теперь в URL нам нужно передать параметр target , содержимое которого мы увидим на экране. Если параметр не будет задан, то переданная строка будет «World». В Yii любой экшн должен начинаться с префикса «action», а затем названия самого действия. Мы так и сделали. В классе SiteController написали public function actionSay . Yii будет искать префикс «action» для того, чтобы отличить действия от других методов.

    Файл представления должен располагаться по следующей схеме: views/ControllerID/ViewName.php . Поэтому в /views/site/ , создаём файл say.php :

    В данном шаблоне у нас присутствует заголовок h1 с начальным словом Hello следом за котором осуществляем вывод переменной target . Заметка: для обеспечения безопасности мы кодируем пришедшее значение.

    Это самый просто пример использования Model View Controller в Yii2. Более детализированную информацию об MVC в Yii2 можно найти тут.

    Теперь давайте настроим деплой нашего проекта на GitHub и удалённый сервер.

    Настройка удалённой среды для нашего проекта

    Обычное Yii приложение должно без особых проблем срабатывать на Apache или Nginx, Я перечислю инструкции для Apache, а для Nginx их можно найти тут.

    Создание репозитория на GitHub

    После того, как мы задали структура нашему приложению, можем создать репозиторий на Github:

    Заметка: советуем скопировать файл .gitignore с GitHub в проект

    /Sites/hello/.gitignore , а не создавать его с нуля.

    Я буду использовать программу Mac OS X GitHub, вы же можете воспользоваться командной строкой. Ниже я перечислили все команды, которые нужно выполнить для добавления новой репы на GitHub (замените «youraccount» вашим GitHub логином):

    Конфигурация Apache на вашем сервере

    Если у вас до сих пор нет LAMP или облачного сервера, можете воспользоваться моими инструкциями. Теперь, когда у вас есть IP адрес, можете заняться настройкой DNS.

    yourdomain.com A 192.161.234.17

    Теперь авторизируйтесь на своём сервере:

    Обновите конфигурацию, установите Git, активируйте mod_rewrite для Apache и mcrypt для PHP (Ubuntu):

    Конфигурация доступа к GitHub на удалённом сервере

    Теперь нам нужно добавить настройки пользователя Github. Для начала установим git на сервере.

    sudo apt-get install git

    Добавляем www-data и пользователю GitHub особые права на каталог www.

    Затем создаём специальный ключ для пользователя через которого будет осуществляться синхронизация с GitHub:

    В результате вы должны скопировать ключ и вставить на GitHub.com:

    Заходим на страницу настроек и вставляем ключ:

    В результате вы должны увидеть:

    Теперь можем скопировать код из репозитория на сервер:

    git clone git@github.com:youraccount/hello.git /var/www/hello

    Если конфигурация правильная, то вы должны увидеть следующую картину (если нет, воспользуйтесь инструкцией):

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

    Создание конфигурации для Apache

    Создание файла конфигурации для Apache:

    Конфигурация для вашего домена:

    Теперь перейдя по адресу http://yourdomain.com/site/say?target=World! вы должны увидеть следующее:

    Поздравляем! Теперь мы можем приступить к более глубокому знакомству с Yii2.

    Данный урок подготовлен для вас командой сайта ruseller.com
    Источник урока: http://code.tutsplus.com/tutorials/programming-with-yii2-getting-started—cms-22440
    Перевел: Станислав Протасевич
    Урок создан: 4 Июня 2015
    Просмотров: 95252
    Правила перепечатки

    5 последних уроков рубрики «PHP»

    Фильтрация данных с помощью zend-filter

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

    Контекстное экранирование с помощью zend-escaper

    Обеспечение безопасности веб-сайта — это не только защита от SQL инъекций, но и протекция от межсайтового скриптинга (XSS), межсайтовой подделки запросов (CSRF) и от других видов атак. В частности, вам нужно очень осторожно подходить к формированию HTML, CSS и JavaScript кода.

    Подключение Zend модулей к Expressive

    Expressive 2 поддерживает возможность подключения других ZF компонент по специальной схеме. Не всем нравится данное решение. В этой статье мы расскажем как улучшили процесс подключение нескольких модулей.

    Совет: отправка информации в Google Analytics через API

    Предположим, что вам необходимо отправить какую-то информацию в Google Analytics из серверного скрипта. Как это сделать. Ответ в этой заметке.

    Подборка PHP песочниц

    Подборка из нескольких видов PHP песочниц. На некоторых вы в режиме online сможете потестить свой код, но есть так же решения, которые можно внедрить на свой сайт.

    Цукерберг рекомендует:  Меню FormBox
    Понравилась статья? Поделиться с друзьями:
    Все языки программирования для начинающих