Создание расширения (extension) в yii2

Если Вы пишете различные проекты, то зачастую, появляются части кода, которые повторяются от проекта к проекту. Конечно можно копировать код и переносить в новые проекты, но наиболее оптимальным вариантом является создание расширения и подключение к проектам через composer.

Для примера, создадим расширение, которое включает в себя компонент для получения профиля пользователя (ФИО, дату рождения). Итак, приступим:

Подготовка:

Создадим миграцию и AR-модель app\models\UserProfile:

$this->createTable('user_profile', [
    'id' => $this->primaryKey(),
    'name' => $this->string()->notNull(),
    'surname' => $this->string()->notNull(),
    'birhday' => $this->date()
]);

1 шаг. Регистрируемся в github (https://github.com/) и packagist (https://packagist.org/). Теперь ваш логин <username> от гитхаба можно использовать в качестве vendorname. На гитхабе создадим новый пустой репозиторий, назовем его yii2-profile.

2 шаг. Воспользуемся генератором расширений gii, заполняем все поля согласно подсказкам:

  • Vendor Name: <username>, например, alpiiscky
  • Package Name: <название расширения>, например, yii2-profile
  • Namespace: <username>\<краткое название расширения>, например, alpiiscky\profile\
  • Type: yii2-extension
  • License: MIT
  • Title: <название расширения>
  • Description: <описание расширения>
  • Author Name: <ваше имя>
  • Author Email: <ваш email>
  • Output Path: <папка, где будем разрабывать расширение>, например, @app/runtime/tmp-extensions

Нажимаем Preview и Generate

3 шаг. Далее, открываем файл composer.json основного проекта и внесем правки в раздел repositories:

"repositories": [
    {
        "type": "composer",
        "url": "https://asset-packagist.org"
    },
    {
        "type": "path",
        "url": "runtime/tmp-extensions/yii2-profile"
    }
]

4 шаг. Создадим компонент ProfileComponent в корневой папке нашего расширения:

<?php

namespace alpiiscky\profile;

use yii\base\Component;
use app\models\UserProfile;

class ProfileComponent extends Component
{
    /**
     * @var string
     */
    public $userClass = 'app\\models\\User';

    /**
     * @var string
     */
    public $name = '';

    /**
     * @var string
     */
    public $surname = '';

    /**
     * @var UserProfile
     */
    protected $profile;

    /**
     * @var string
     */
    public $birthday = '';

    public function __construct($config = [])
    {
        $profile = UserProfile::findOne(\Yii::$app->user->id);

        if ($profile) {
            $this->name = $profile->name;
            $this->surname = $profile->surname;
            $this->birthday = $profile->birthday;
        }

        parent::__construct($config);
    }

}

5 шаг. Проведем composer require <username>/<название расширения>:dev-master в основом проекте. Теперь подключим компонент в @app/config/web.php:

'components' => [
    'profile' => [
        'class' => '<username>\profile\ProfileComponent',
    ],
    ...
],

И компонент доступен через \Yii::$app->profile

6 шаг. Когда разработка расширения завершена, необходимо отправить данное расширение на гитхаб, для этого консолью заходим в папку @app/runtime/tmp-extensions/<название расширения> и выполняем команды:

git init
git commit -m 'init'
git remote add origin https://github.com/<username>/<название репозитория>.git
git push -u origin master

7 шаг. Заходим в packagist.org и нажимаем Submit, вставляем ссылку до гитхаб-репозитория: https://github.com/<username>/<название репозитория>.

Теперь подправим секцию из шага 3:

"repositories": [
    {
        "type": "composer",
        "url": "https://asset-packagist.org"
    }
]

После этого написанное расширение доступно для установки через композер.

{{ message }}

{{ 'Comments are closed.' | trans }}