Yii2 узнать расширение файла

Обновлено: 05.07.2024

  • Open with Desktop
  • View raw
  • Copy raw contents Copy raw contents Loading

Copy raw contents

Copy raw contents

Расширения - это распространяемые программные пакеты, специально разработанные для использования в приложениях Yii и содержащие готовые функции. Например, расширение yiisoft/yii2-debug добавляет удобную отладочную панель в нижнюю часть каждой страницы вашего приложения, чтобы помочь вам разобраться в том, как генерируются страницы. Вы можете использовать расширения для ускорения процесса разработки. Вы также можете оформить ваш код как расширение, чтобы поделиться с другими людьми результатами вашей работы.

Info: Мы используем термин "расширение" для специфичных для Yii программных пакетов. Программные пакеты общего назначения, которые могут быть использованы без Yii, мы будем называть "пакет" или "библиотека".

Чтобы использовать расширение, вам необходимо установить его. Большинство расширений распространяются как пакеты Composer, которые могут быть установлены посредством следующих двух шагов:

  1. Отредактируйте файл вашего приложения composer.json , указав, какие расширения (пакеты Composer) вы хотите установить.
  2. Выполните команду php composer.phar install , чтобы установить указанные расширения.

Обратите внимание, что вам может потребоваться установить Composer, если у вас его нет.

Расширения, установленные Composer'ом, хранятся в директории BasePath/vendor , где BasePath - базовая директория приложения. Composer - это менеджер зависимостей, и поэтому после установки пакета он также установит все зависимые пакеты.

Например, для установки расширения yiisoft/yii2-imagine нужно отредактировать ваш composer.json как показано далее:

После установки вы можете увидеть директорию yiisoft/yii2-imagine , находящуюся по пути BasePath/vendor . Также вы можете увидеть директорию imagine/imagine , которая содержит зависимый пакет.

Info: yiisoft/yii2-imagine является базовым расширением, которое разрабатывает и поддерживает команда разработчиков Yii. Все базовые расширения размещены на Packagist и называются yiisoft/yii2-xyz , где xyz является названием расширения.

Теперь вы можете использовать установленное расширение как часть вашего приложения. Следующий пример показывает, как вы можете использовать класс yii\imagine\Image , который содержится в расширении yiisoft/yii2-imagine .

Ручная установка расширений

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

  1. загрузить архив с файлами расширения и распаковать его в директорию vendor .
  2. установить автозагрузчики классов, предоставляемые расширениями, если таковые имеются.
  3. загрузить и установить все зависимые расширения в соответствии с инструкциями.

Если расширение не имеет автозагрузчика классов, но следует стандарту PSR-4, то вы можете использовать автозагрузчик классов, предоставленный Yii для загрузки классов расширений. Всё, что вам нужно сделать, это объявить псевдоним для корневого каталога расширения. Например, если вы установили расширение в директорию vendor/mycompany/myext и классы расширения находятся в пространстве имён myext , то вы можете включить следующий код в конфигурацию вашего приложения:

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

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

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

Каждый пакет Composer должен иметь файл composer.json в своей корневой директории. Этот файл содержит метаданные о пакете. Вы можете найти полную спецификацию по этому файлу в Руководстве Composer. Следующий пример демонстрирует файл composer.json для расширения yiisoft/yii2-imagine :

Каждый пакет Composer должен иметь название, которое однозначно идентифицирует пакет среди остальных. Название пакета имеет формат имяРазработчика/названиеПроекта . Например, в пакете yiisoft/yii2-imagine , yiisoft является именем разработчика, а yii2-imagine - названием пакета.

НЕ используйте yiisoft в качестве имени разработчика, так как оно зарезервировано для использования в коде ядра Yii.

Мы рекомендуем использовать префикс yii2- в названии проекта для пакетов, являющихся расширениями Yii 2, например, моёИмя/yii2-mywidget . Это позволит пользователям легче определить, что пакет является расширением Yii 2.

Важно указать тип пакета вашего расширения как yii2-extension , чтобы пакет можно было распознать как расширение Yii во время установки.

Когда пользователь запускает команду php composer.phar install для установки расширения, файл vendor/yiisoft/extensions.php будет автоматически обновлён, чтобы включить информацию о новом расширении. Из этого файла приложение Yii может узнать, какие расширения установлены (информацию можно получить с помощью [[yii\base\Application::extensions]]).

Ваше расширение зависит от Yii (естественно). Вы можете посмотреть список зависимостей в секции require , входящей в файл composer.json . Если ваше расширение зависит от других расширений или сторонних библиотек, то вы также должны их перечислить. Убедитесь, что в ограничениях вы указали соответствующую версию (например, 1.* , @stable ) для каждой зависимости. Используйте стабильные версии зависимостей, когда будет выпущена стабильная версия вашего расширения.

Для того, чтобы ваши классы были загружены автозагрузчиком классов Yii или автозагрузчиком классов Composer, вы должны внести секцию autoload в файл composer.json , как показано ниже:

Вы можете перечислить один или несколько корневых пространств имён и соответствующие им пути.

Когда расширение установлено в приложение, Yii для каждого указанного корневого пространства имён создаст псевдоним, который указывает на директорию, соответствующую пространству имён. Например, указанная в секции autoload запись будет соответствовать псевдониму @yii/imagine .

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

Во избежание конфликтов имён, а также для того, чтобы ваши классы были автозагружаемыми, вы должны следовать стандарту PSR-4 или стандарту PSR-0 в использовании пространств имён и названии классов вашего расширения.

Пространства имён в ваших классах должны начинаться с имяРазработчика\названиеРасширения , где названиеРасширения совпадает с названием проекта в названии пакета, за исключением того, что оно не должно содержать префикса yii2- . Например, для расширения yiisoft/yii2-imagine мы используем yii\imagine в качестве пространства имён.

Не используйте yii , yii2 или yiisoft в качестве имени разработчика. Эти имена являются зарезервированными для использования в коде ядра Yii.

Классы начальной загрузки

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

Для достижения этой цели вы можете создать так называемый класс начальной загрузки, реализовав интерфейс [[yii\base\BootstrapInterface]]. Например,

Затем нужно добавить этот класс в файл composer.json вашего расширения, как показано далее,

Когда расширение будет установлено в приложение, Yii автоматически инициирует экземпляр класса начальной загрузки и вызовет его метод [[yii\base\BootstrapInterface::bootstrap()|bootstrap()]] в процессе начальной загрузки каждого запроса.

Работа с базами данных

Ваше расширение может иметь доступ к базам данных. Не думайте, что приложения, которые используют ваше расширение, всегда используют Yii::$db в качестве соединения с БД. Вместо этого вам следует объявить свойство db в классах, которым необходим доступ в БД. Это свойство позволит пользователям вашего расширения настроить соединение с БД, которое они будут использовать в вашем расширении. В качестве примера вы можете обратиться к классу [[yii\caching\DbCache]] и посмотреть, как он объявляет и использует свойство db .

Если в вашем приложении необходимо создать определённые таблицы БД или сделать изменения в схеме БД, вы должны

  • создать файлы миграций для изменения схемы БД вместо простых SQL-файлов;
  • попытаться сделать миграции, применимые к различным СУБД;
  • избегать использования Active Record в миграциях.

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

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

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

Интернационализация и локализация

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

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

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

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

Вы можете давать каждому выпуску вашего расширения номер версии (например, 1.0.1 ). Мы рекомендуем вам придерживаться практик семантического версионирования при определении, какой номер версии должен использоваться.

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

Если это первый выпуск вашего расширения, вы должны зарегистрировать его в репозитории Composer, таком, как Packagist. После этого вам остаётся только создать тег выпуска (например, v1.0.1 ) в VCS репозитории вашего расширения и уведомить репозиторий Composer о новом выпуске. Люди смогут найти новую версию и установить или обновить расширение через репозиторий Composer.

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

  • Файл readme в корневой директории пакета: он описывает, что ваше расширение делает, а также как его установить и использовать. Мы рекомендуем вам написать его в формате Markdown и дать ему название readme.md .
  • Файл changelog в корневой директории пакета: он описывает, какие изменения произошли в каждом выпуске. Этот файл может быть написан в формате Markdown и назван changelog.md .
  • Файл upgrade в корневой директории пакета: он даёт инструкции о том, как обновить старые версии расширения. Этот файл может быть написан в формате Markdown и назван upgrade.md .
  • Руководства пользователя, демо-версии, скриншоты и т.д.: они необходимы, если ваше расширение предоставляет много возможностей, которые невозможно полностью описать в файле readme.
  • Документация API: ваш код должен быть документирован, чтобы позволить другим людям легко читать и понимать его. Вы можете обратиться к файлу класса BaseObject, чтобы узнать, как нужно документировать код.

Info: Ваши комментарии к коду могут быть написаны в формате Markdown. Расширение yiisoft/yii2-apidoc предоставляет инструмент для генерации документации API на основе ваших комментариев.

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


В данной статье я расскажу как создать расширение для проекта на фреймворке yii-2, которое будет устанавливаться с помощью Composer. Его можно будет использовать в других своих проектах, а так же опубликовать для использования другими людьми.

  • установить расширение;
  • выполнить миграцию.

Назовем расширение «mytest» и его структура будет такова:


При разработке своего расширения с нуля, в yii2 можно пользоваться помощником для создания начальных файлов, таких как composer.json, README.md.



В данном помощнике нужно заполнить несколько обязательных полей согласно изображения. Прежде всего Вам нужно иметь аккаунт на GitHub, название которого необходимо прописать в поле Vendor Name (у меня klisl). Это будет корневой каталог в котором будут создаваться папки каждого из ваших расширений, название которых прописывается в поле Package Name. Стоит отметить, что разработчики данного фреймворка рекомендуют использовать префикс «yii2-» в названии расширений (пакетов), являющихся расширениями Yii-2. Поэтому я указал yii2-mytest.

В поле Namespace нужно указать пространство имен вашего расширения чтобы автозагрузчик Composer смог отыскать файлы и чтобы название классов расширения не конфликтовали с одноименными классами других расширений и самого фреймворка. Лучше всего пространство имен указывать как название вашего аккаунта на GitHub\название расширения (пакета) без приставки «yii2-».
В качестве типа указывается расширение или же библиотека (содержащая классы), а в качестве лицензии обычно выбирается MIT, что значит бесплатно распространяется и используется кем угодно без ограничений на свой страх и риск.

Отправив заполненную форму помощника, по-умолчанию, у вас создастся 3 файла в папке runtime\tmp-extensions . Это файлы, которые изначально находятся в vendor\yiisoft\yii2-gii\generators\extension\default и потом копируются туда с подставленными значениями из формы.

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

Помощник создания расширений в yii2 предполагает сразу после создания начальных файлов в временной папке runtime\tmp-extensions синхронизацию их с удаленным репозиторием типа GitHub и дальнейшей работой вплотную с помощью git. Я же расширения для фреймворков создаю как отдельные приложения. Например используя Опенсервер, в данном случае, я бы создал каталог klisl на уровне других приложений и в нем уже папки расширений:
W:\domains\klisl\yii2-mytest
Таким образом работаю над расширением локально и выгружаю на GitHub уже более-менее сформированное расширение с одновременной регистрацией его на Packagist (если планируется сделать свое расширение доступным для общественности) для окончательного тестирования.

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

Создание файлов расширения.

Создадим теперь файл composer.json нашего расширения.
Опять же, можно создать данный файл в интерактивном режиме используя консоль и команду
Перед этим нужно перейти в корневой каталог расширения.
Если Composer установлен не глобально, то вместо
composer
нужно писать
php composer.phar
Данные тонкости не относятся к теме этой статьи.
Будет предложено ввести данные по названию проекта, автору, предложено сразу вписать нужные зависимости.

Все файлы composer.json имеют одни и те же поля и структуру, поэтому опять же, можно просто взять за основу другой подобный файл. Для нашего тестового расширения он будет выглядеть так:
Немного подробностей.
В основном файле расширения «composer.json» нужно указать тип пакета:
чтобы пакет можно было распознать как расширение Yii во время установки.
Когда пользователь запустит команду для установки расширения, файл vendor/yiisoft/extensions.php будет автоматически обновлён, чтобы включить информацию о новом расширении. Из этого файла приложение Yii может узнать, какие расширения установлены (информацию о установленных расширениях можно получить с помощью вызова yii\base\Application::extensions).

В объекте "require" указываются зависимости вашего пакета. Например стоит указать:
т.к. если расширение для фреймворка yii2, то и работать без него оно не может.

Важным моментом для многих расширений является возможность выполнить определенный код в процессе начальной загрузки приложения, еще до выполнения кода контроллера и прочего. Например если понадобится внедрить свои правила маршрутизации, контроллеры… В Yii2 для этого используется так называемый класс начальной загрузки. Класс начальной загрузки должен реализовывать интерфейс yii\base\BootstrapInterface. Пример класса автозагрузки я создам в нашем тестовом расширении, чтобы продемонстрировать данную возможность. На данном этапе нужно только его подключить в composer.json расширения, что сделано в поле

С основным файлом расширения закончили. Так же, если вы планируете сделать ваше расширение общедоступным, следует создать файл README.md описывающий как устанавливать и использовать ваш пакет. Данный файл можно сформировать автоматически непосредственно при создании нового репозитория для вашего расширения на GitHub и потом отредактировать или же скопировать код другого подобного файла. Пример можно посмотреть в архиве с файлами тестового расширения.

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

Для демонстрации подключения стилей или скриптов создадим такой файлик:
Файл assets/css/style.css

Далее, двигаясь сверху вниз по изображению структуры нашего расширения создаем его контроллер:
Файл src/controllers/TestController.php

Для всех классов в каталоге src не забываем указывать обозначенное в файле composer.json расширения пространство имен klisl\mytest и далее в зависимости от папки в которой находится текущий класс. Так автозагрузчик Composera сможет его отыскать согласно стандарта psr-4.
Контроллер создается и используется стандартно. В нем я регистрирую класс TestsAssetsBundle для подключения нашего созданного выше файла стилей. Данный класс создадим чуть ниже.
Далее получаем данные из БД и передаем в вид.

Для демонстрации создания таблицы в базе данных для нужд расширения создаем файл миграции. Его можно создать обычным способом в основном приложении:
и далее перенести в папку src/migrations расширения или создать вручную.

  • для basic (config\db.php);
  • для advanced (common\config\main-local.php) в массиве db.

Раз есть миграция значит должна быть модель для работы с данной таблицей.
Файл src/models/Tests.php

Теперь файл-представление (вид).
Файл src/views/test/index.php

Структуру MVC мы создали, осталось еще несколько файлов управляющих модулем.

Создаем файл выполняющийся при загрузке фреймворка (класс начальной загрузки)
Файл src/Bootstrap.php:

Далее создаем класс модуля, т.к. наше расширение будет работать как отдельный модуль в yii-2.
Файл src/Module.php

Тут мы указываем в свойстве $controllerNamespace путь к контроллеру модуля. Теперь мы добавили контроллер модуля в список контроллеров и маршрут, который создали немного выше сможет его найти.

Ну и завершающим файлом создадим файл с классом подключающим наш CSS файл к файлу-представления. Напомню, что данный класс мы зарегистрировали для представления нашего расширения в его контроллере:

Тут мы указываем путь к папке со стилями и скриптами в свойстве $sourcePath и сами файлы в свойстве
$css и $js

Подключение локального расширения.

Т.к. расширение находится на локальном компьютере, необходимо указать Composerу находящемуся в корне основного проекта в котором будем его тестировать от куда нужно скачивать расширение. В нашем случае просто создастся ссылка на папку с ним.
Для этого в файле composer.json yii-проекта добавим секцию:

По значению поля «url» видно, что необходимо подняться на один уровень выше, то есть выйти в общий каталог проектов и далее подключить файл composer.json уже самого расширения.

Кроме этого нужно подключить его, т.е. обновить зависимости файла composer.json основного проекта, а так же чтобы обновился автозагрузчик классов у Composer. Для этого нужно выполнить команду из корня основного проекта:

Расширение автоматически получит алиас, в нашем случае
@klisl/mytest
который будет вести на
…\vendor/klisl/yii2-mytest/src
т.к. в файле composer.json самого расширения есть такой блок:
Вы можете получить данный путь и вывести его на экран таким образом:

Теперь наше расширение можно найти в файле vendor/yiisoft/extensions.php где очень наглядно видно куда ведет созданный алиас, а так же наличие массива bootstrap, в значении у которого находится путь к файлу автозагрузки расширения.

Для создания таблицы нужно перейти в корень основного проекта и выполнить миграцию:
тут мы указываем используя алиас @klisl/mytest путь к каталогу src расширения и далее в папку migrations к файлу миграции. Ключ --interactive=0 значит, что при выполнении данной команды не нужно спрашивать подтверждение о создании таблицы пользователя. Т.к. раз расширению она нужна, то создавать нужно в любом случае.

Расширения - это распространяемые программные пакеты, специально разработанные для использования в Yii-приложениях и предоставляющие готовые к использованию функции. Например, расширение yiisoft/yii2-debug добавляет удобную панель отладки внизу каждой страницы вашего приложения, чтобы помочь вам более легко понять, как создаются страницы. Вы можете использовать расширения, чтобы ускорить процесс разработки. Вы также можете упаковать свой код как расширение, чтобы поделиться с другими людьми своей замечательной работой.

Использование расширений

Чтобы использовать расширение, вам нужно сначала установить его. Большинство расширений распространяются как пакеты Composer, которые можно установить, выполнив следующие два простых действия:

  • Измените файл composer.json вашего приложения и укажите, какие расширения (пакеты Composer) вы хотите установить.
  • Запустите composer install чтобы установить указанные расширения.

Обратите внимание, что вам может потребоваться установить Composer, если у вас его нет.

Расширения, установленные Composer, хранятся в каталоге BasePath/vendor , где BasePath ссылается на базовый путь приложения. Поскольку Composer является диспетчером зависимостей, при установке пакета он также устанавливает все зависимые пакеты.

Например, чтобы установить расширение yiisoft/yii2-imagine , измените свой composer.json следующим образом:

После установки вы должны увидеть каталог yiisoft/yii2-imagine под BasePath/vendor . Вы также должны увидеть другой каталог imagel/imagine , который содержит установленный зависимый пакет.

Теперь вы можете использовать установленные расширения, такие как они являются частью вашего приложения. Следующий пример показывает, как вы можете использовать класс yii\imagine\Image , предоставляемый расширением yiisoft/yii2-imagine :

Установка расширений вручную

В некоторых редких случаях вам может понадобиться установить некоторые или все расширения вручную, вместо того, чтобы полагаться на Composer. Для этого вам необходимо:

  1. Загрузите архивные файлы расширений и распакуйте их в каталоге vendor.
  2. Установите автозагрузчики классов, предоставляемые расширениями, если таковые имеются.
  3. Загрузите и установите все зависимые расширения в соответствии с инструкциями.

Если расширение не имеет автозагрузчика классов, но следует стандарту PSR-4, вы можете использовать автозагрузчик классов, предоставленный Yii, для автоматической загрузки классов расширения. Все, что вам нужно сделать, это просто объявить корневой псевдоним для корневого каталога расширения. Например, предположив, что вы установили расширение в каталоге vendor/mycompany/myext и классы расширения находятся в пространстве имен myext, вы можете включить в свою конфигурацию приложения следующий код:

Создание расширений

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

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

Ниже приведены основные шаги, которые вы можете выполнить, чтобы создать расширение как пакет Composer.

composer.json

Каждый пакет Composer должен иметь файл composer.json в корневом каталоге. Файл содержит метаданные о пакете. В следующем примере показан файл composer.json для расширения yiisoft/yii2-imagine :

Package Name

Каждый пакет Composer должен иметь имя пакета, которое однозначно идентифицирует пакет среди всех остальных. Формат имен пакетов называется vendorName/projectName . Например, в названии пакета yiisoft/yii2-imagine имя поставщика и название проекта - yiisoft и yii2-imagine, соответственно.

НЕ используйте yiisoft в качестве имени вашего поставщика, так как он зарезервирован для использования кодом ядра Yii.

Мы рекомендуем вам прикрепить yii2- к имени проекта для пакетов, представляющих расширения Yii 2, например myname/yii2-mywidget . Это позволит пользователям легче определить, является ли пакет расширением Yii 2.

Package Type

Важно, чтобы вы указывали тип пакета своего расширения как yii2-extension , чтобы при установке его можно было распознать как расширение Yii.

Когда пользователь запускает composer install для установки расширения, файл vendor/yiisoft/extensions.php будет автоматически обновлен, чтобы включить информацию о новом расширении. Из этого файла приложения Yii могут узнать, какие расширения установлены (информация может быть доступна через yii\base\Application::$extensions ).

Dependencies

Ваше расширение зависит от Yii. Поэтому вы должны указать его ( yiisoft/yii2 ) в записи require в composer.json . Если ваше расширение также зависит от других расширений или сторонних библиотек, вы также должны их перечислить. Убедитесь, что вы также указали соответствующие ограничения версии (например, 1. *, @stable) для каждого зависимого пакета. Используйте стабильные зависимости, когда ваше расширение выпущено в стабильной версии.

Большинство пакетов JavaScript/CSS управляются с помощью Bower или NPM вместо Composer. Yii использует плагин активов Composer, чтобы позволить управлять этими видами пакетов через Composer. Если ваше расширение зависит от пакета Bower, вы можете просто перечислить зависимость в composer.json следующим образом:

В приведенном выше коде указано, что расширение зависит от пакета jquery Bower. В общем случае вы можете использовать bower-asset/PackageName для ссылки на пакет Bower в composer.json и использовать npm-asset/PackageName для обращения к пакету NPM. Когда Composer устанавливает пакет Bower или NPM, по умолчанию содержимое пакета будет установлено в каталогах @vendor/bower/PackageName и @vendor/npm/Packages соответственно. Эти два каталога также можно отнести к использованию более коротких псевдонимов @bower/PackageName и @npm/PackageName .

Class Autoloading

Чтобы ваши классы автоматически загружались автозагрузчиком класса Yii или автозагрузчиком класса Composer, вы должны указать запись autoload в файле composer.json, как показано ниже:

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

Когда расширение установлено в приложении, Yii создаст для каждого перечисленного корневого пространства имен псевдоним, который ссылается на каталог, соответствующий пространству имен. Например, указанное выше объявление autoload будет соответствовать псевдониму с именем @yii/imagine .

Рекомендуемая практика

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

Namespaces

Чтобы избежать коллизий имен и сделать классы в вашем расширении автозагружаемыми, вы должны использовать пространства имен и называть классы в своем расширении, следуя стандарту PSR-4 или стандарту PSR-0.

Пространства имен классов должны начинаться с vendorName\extensionName, где extensionName похож на имя проекта в имени пакета, за исключением того, что он не должен содержать префикс yii2. Например, для расширения yiisoft/yii2-imagine мы используем yii\imagine как пространство имен для его классов.

Не используйте yii, yii2 или yiisoft в качестве имени вашего поставщика. Эти имена зарезервированы для использования кодом ядра Yii.

Bootstrapping Classes

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

Для достижения этой цели вы можете создать так называемый класс начальной загрузки, реализуя yii\base\BootstrapInterface . Например:

Затем вы указываете этот класс в файле composer.json вашего расширения, как показано ниже:

Когда расширение установлено в приложении, Yii автоматически создает экземпляр класса bootstrapping и вызывает его метод bootstrap() во время процесса начальной загрузки для каждого запроса.

Работа с базами данных

Вашему расширению может потребоваться доступ к базам данных. Не думайте, что приложения, использующие ваше расширение, всегда будут использовать Yii::$db в качестве соединения с БД. Вместо этого вам нужно объявить свойство db для классов, которые требуют доступа к базе данных. Свойство позволит пользователям вашего расширения настраивать, какое соединение с БД они хотели бы использовать вашему расширению. В качестве примера вы можете обратиться к классу yii\caching\DbCache и посмотреть, как он объявляет и использует свойство db.

Если вашему расширению необходимо создать конкретные таблицы БД или внести изменения в схему БД, вы должны

  • Обеспечить миграцию для манипулирования схемой БД, вместо использования простых файлов SQL;
  • Попытайтесь сделать миграции применимыми к разным СУБД;
  • Избегайте использования Active Record в процессах миграции.

Использование Assets

Если ваше расширение представляет собой виджет или модуль, скорее всего, для его работы может потребоваться некоторое количество ресурсов. Например, модуль может отображать некоторые страницы, содержащие изображения, JavaScript и CSS. Поскольку файлы расширения находятся в одном каталоге, который не доступен в Интернете при установке в приложении, у вас есть два варианта, чтобы файлы активов были доступны через веб:

  • Попросить пользователей расширения вручную скопировать файлы активов в определенную папку, доступную в Интернете;
  • Объявлять набор ресурсов и полагаться на механизм публикации активов, чтобы автоматически копировать файлы, перечисленные в наборе активов, в папку, доступную в Интернете.

Интернационализация и локализация

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

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

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

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

Версии

Каждому выпуску расширения необходимо присвоить номер версии (например, 1.0.1).

Релизы

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

Если вы в первый раз выпускаете расширение, вам следует зарегистрировать его в репозитории Composer, таком как Packagist. После этого все, что вам нужно сделать, - просто создать тег release (например, v1.0.1) в репозитории VCS вашего расширения и уведомить репозиторий Composer о новой версии. Затем люди смогут найти новую версию и установить или обновить расширение через репозиторий Composer.

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

  • Файл readme в корневом каталоге пакета: он описывает, что делает ваше расширение, и как его установить и использовать. Мы рекомендуем вам записать его в формате Markdown и назвать файл как readme.md.
  • Файл журнала изменений в корневой папке пакета: в нем перечислены изменения, внесенные в каждую версию. Файл может быть записан в формате Markdown и назван как changelog.md.
  • Файл обновления в корневом каталоге пакета: в нем приводятся инструкции о том, как обновить устаревшие версии расширения. Файл может быть записан в формате Markdown и назван как upgrade.md.
  • Обучающие программы, демонстрации, скриншоты и т. д .: они необходимы, если ваше расширение предоставляет множество функций, которые не могут быть полностью охвачены в файле readme.
  • Документация API: ваш код должен быть хорошо документирован, чтобы позволить другим людям легче читать и понимать его. Вы можете обратиться к файлу класса Object, чтобы узнать, как документировать код.

Core Extensions

What You'll Be Creating

Если вы спрашиваете «Что такое Yii?», ознакомьтесь с моим предыдущим учебным руководством: Введение в Yii Framework, в котором рассматриваются преимущества Yii и которое включает обзор новинок в Yii 2.0, выпущенного в октябре 2014 года.

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

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

Просто напоминание, я участвую в комментариях ниже. Меня особенно интересует, если у вас разные подходы, дополнительные идеи или вы хотите предложить темы для будущих учебников. Если у вас есть вопрос или предложение темы, пожалуйста, напишите ниже. Вы также можете связаться со мной в Twitter @reifman напрямую.

Плагины загрузки файлов

Yii2 Image Uploads - Kartik File Input Widget Demo Examples
Yii2 Image Uploads - Kartik File Input Widget Demo Examples
Yii2 Image Uploads - Kartik File Input Widget Demo Examples

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

Для этого урока я решил использовать плагин Kartik. По моему мнению он проще в использовании и лучше документирован, чем плагин 2Amigos. Тем не менее, BlueImp File Uploader имеет некоторые интригующие функции пользовательского интерфейса, которые вы можете изучить (показано ниже):

Yii2 Image Uploads - 2Amigos and BlueImp File Upload Examples
Yii2 Image Uploads - 2Amigos and BlueImp File Upload Examples
Yii2 Image Uploads - 2Amigos and BlueImp File Upload Examples

Работа с плагином FileInput

Давайте начнем устанавливать и использовать загрузчик файлов и интегрировать его в наш Twitter-подобный апплет создания статуса. Опять же, мы будем использовать дерево приложения Yii2 Hello, которое вы можете загрузить с помощью ссылки кнопки GitHub рядом или ниже.

Установка плагина

Во-первых, мы можем использовать composer для добавления kartik-v/yii2-widget-fileinput в наше приложение:

Расширение таблицы Status

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

Поля, которые мы добавим, относятся к исходному имени загруженного файла, а также к уникальному имени файла, которое будет храниться на нашем сервере для отображения:

  • image_src_filename
  • image_web_filename

Создайте новую миграцию для добавления этих полей в таблицу Status:

Вот настраиваемая миграция для добавления двух полей в виде строк:

Затем выполните миграцию:

Поскольку Yii2 построен на архитектуре Model View Controller (MVC), существуют три другие области кодирования, которые нам необходимо реализовать для загрузчика файлов:

  1. Модель Status
  2. Представление Status и форма
  3. Контроллер Status

Улучшение функциональности модели

Теперь мы внесем изменения в файл /models/Status.php . Прежде всего, нам нужно предоставить атрибуты и правила проверки для новых полей изображения, а также временную переменную $image , которую виджет будет использовать для загрузки файла.

Ниже мы добавляем комментарии для двух новых переменных $image_xxx_filename и создаем общедоступную временную переменную с именем $image :

Затем мы добавим правила проверки для нашего изображения, такие как тип файла и максимальный размер:

И новые названия атрибутов для представлений:

Теперь мы можем перейти к изменениям в представлении в форме ActiveModel.

Добавление нашего представления и функциональности формы

Интеграция загрузки изображений в форму создания статуса

Yii2 Image Uploads - Creating a Status with Our New File Input Capability
Yii2 Image Uploads - Creating a Status with Our New File Input Capability
Yii2 Image Uploads - Creating a Status with Our New File Input Capability

Чтобы включить интеграцию с загрузкой изображений в обновления статусов (см. выше), нам необходимо внести изменения в файл /views/status/_form.php .

Во-первых, мы включаем виджет kartik\file\FileInput в начале файла и обновляем форму, разрешая мульти-загрузку файлов:

В строке pluginOptions мы ограничиваем типы файлов обычными форматами изображений, такими как jpg.

По завершении он будет выглядеть примерно так, ожидая, пока пользователь добавит изображение:

Yii2 Image Uploads - Create Status Page with File Upload Added
Yii2 Image Uploads - Create Status Page with File Upload Added
Yii2 Image Uploads - Create Status Page with File Upload Added

Отображение изображения

Я также собираюсь позже добавить код для отображения загруженного изображения (после того, как мы закончим поддержку контроллера).

Во-первых, я добавлю его на страницу просмотра статуса ( /views/status/view.php ), что очень просто. Однако, я выведу изображение ниже деталей:

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

Yii2 Image Uploads - Enhanced Status View with Image Below
Yii2 Image Uploads - Enhanced Status View with Image Below
Yii2 Image Uploads - Enhanced Status View with Image Below

Мы также добавим просмотр миниатюр на нашу страницу статуса ( /views/status/index.php ). Я добавил дополнительный столбец в виджет Yii2 GridView:

В конечном итоге это будет выглядеть так:

Yii2 Image Uploads - Enhanced Status Index with Uploaded Image Thumbnails
Yii2 Image Uploads - Enhanced Status Index with Uploaded Image Thumbnails
Yii2 Image Uploads - Enhanced Status Index with Uploaded Image Thumbnails

Создание поддержки контроллера

Чтобы сделать все возможное, нам нужно завершить интеграцию с контроллером.

В верхней части /controllers/StatusController.php мы должны включить yii\web\UploadedFile :

Затем мы должны обновить функцию actionCreate :

По существу, этот код выполняет следующие операции:

  1. Мы фиксируем исходное имя файла из данных формы - имя загруженного файла ( image_src_filename ).
  2. Мы генерируем уникальное имя файла для нашего сервера ( image_web_filename ).
  3. Мы сохраняем файл в нашем каталоге загрузки ( /web/uploads/status/ ).
  4. Мы сохраняем модель.
  5. Мы делаем перенаправление на страницу расширенного просмотра.

На картинке выше вы можете увидеть окончательный результат, который включает в себя изображение Тадж-Махала.

Kartik's File Input Widget также предлагает более продвинутые конфигурации, которые он достаточно хорошо документирует, например Drag and Drop:

Yii2 Image Uploads - Enhanced File Input Widget Options with Drag and Drop
Yii2 Image Uploads - Enhanced File Input Widget Options with Drag and Drop
Yii2 Image Uploads - Enhanced File Input Widget Options with Drag and Drop

Ознакомьтесь с ними на следующих страницах:

Что дальше?

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

Yii2 File Uploader Meeting Planner User Profile Image Upload
Yii2 File Uploader Meeting Planner User Profile Image Upload
Yii2 File Uploader Meeting Planner User Profile Image Upload

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

Если вы хотите узнать, когда выйдет следующий урок по Yii2, следуйте за мной @reifman в Twitter или проверьте мою страницу инструктора. Моя страница инструктора будет включать все статьи из этой серии, как только они будут опубликованы.

Ссылки по теме

Вот несколько ссылок, которые я использовал для исследования и написания этого руководства:

Читайте также: