В последнее время я начал создавать пакеты для Laravel и PHP. И, конечно же, как всегда, при разработке вы должны иметь возможность создавать и тестировать свои пакеты локально.
Кроме того, если вы хотите применить СУХОЙ подход к некоторому коду и предотвратить повторение одного и того же кода в нескольких проектах, вы можете извлечь его в пакет и загрузить локально.

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

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

Сначала создайте каталог в корневой папке проекта. Я предпочитаю packages/vendor-name/package-name .

Для пакетов laravel по соглашению лучше использовать префикс laravel.
Например:

Создадим первый пакет

Создайте папку с именем laravel-hello внутри packages/vendor-name/laravel-hello в корневой папке проекта laravel.
Структура папок будет выглядеть примерно так:

Обычно vendor-name должно соответствовать вашему имени пользователя GitHub.
В папке src находится вся магия.

Теперь мы заходим внутрь пакета laravel-hello, выполнив следующее:

cd ./packages/erlandmuchasaj/laravel-hello

Затем мы инициализируем композитор, выполнив следующую команду:

composer init

Эта команда задаст вам несколько вопросов относительно создаваемого пакета, но пока вы можете принять пакет по умолчанию. Вы всегда сможете отредактировать их позже composer.json .

Вот пример того, как будет выглядеть файл composer.json.

После инициализации мы можем перейти к packages/erlandmuchasaj/laravel-hello/composer.json и отредактировать его следующим образом:

{
    "name": "erlandmuchasaj/laravel-hello",
    "description": "A simple Laravel package showing rock paper scissors lizard spock rules..",
    "type": "project",
    "license": "MIT",
    "authors": [
        {
            "name": "Erland Muchasaj",
            "email": "[email protected]"
        }
    ],
    "autoload": {
        "psr-4": {
            "ErlandMuchasaj\\LaravelHello\\": "src/"
        }
    },
    "require": {
      "php": "^8.1"
    },
    "minimum-stability": "dev",
    "prefer-stable": false
}

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

Обратите особое внимание на объект autoload.

Этот файл composer.json указывает, что пакет имеет пространство имен ErlandMuchasaj\LaravelHello и что любые классы в этом пространстве имен должны загружаться из каталога src/. Также указано, что для пакета требуется PHP версии 8.1 или выше.

Внутри папки /src мы создаем класс PHP с именем RockPaperScissorsLizardSpock.php.

<?php

namespace ErlandMuchasaj\LaravelHello;

class RockPaperScissorsLizardSpock
{

    public function  rules(): string
    {
        return 'Scissors cuts paper,
                Paper covers rock,
                Rock crushes lizard,
                Lizard poisons Spock,
                Spock smashes scissors,
                Scissors decapitates lizard,
                Lizard eats paper,
                Paper disproves Spock,
                Spock vaporizes rock,
                and as it always has, rock crushes scissors.';
    }

}

Имейте в виду, что пакет composer.json отличается от проекта composer.json.

Теперь откройте файл composer.json корневого каталога и добавьте раздел repositories. Этот раздел должен включать ссылку на ваш локальный каталог пакетов.

{
    ...
    "repositories": [
        {
            "type": "path",
            "url": "./packages/erlandmuchasaj/laravel-hello",
            "options": {
                "symlink": true
            }
        }
    ]
}

Передача параметра "symlink": true означает, что исходная папка нашего пакета будет связана с каталогом vendor нашего проекта PHP, и нам не нужно делать composer update каждый раз, когда мы делаем обновление пакета.

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

    "require": {
        "php": "^8.1",
        "erlandmuchasaj/laravel-hello": "@dev", // <== load package
        "guzzlehttp/guzzle": "^7.2",
        "laravel/framework": "^10.0",
        "laravel/sanctum": "^3.2",
        "laravel/tinker": "^2.8",
    },

Обратите внимание, поскольку имя пакета, которое мы использовали в списке требований, соответствует имени пакета в файле composer.json выше.

Теперь все, что вам нужно сделать, это запустить composer update и вуаля.

Тестирование, если это работает

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

<?php

use ErlandMuchasaj\LaravelHello\RockPaperScissorsLizardSpock;

$game= new RockPaperScissorsLizardSpock();

echo $game->rules();
Scissors cuts paper,
paper covers rock,
rock crushes lizard,
lizard poisons Spock,
Spock smashes scissors,
scissors decapitates lizard,
lizard eats paper,
paper disproves Spock,
Spock vaporizes rock,
and as it always has, rock crushes scissors.

После того, как вы закончите разработку своего пакета локально, вы можете удалить его из раздела repositories файла вашего проекта composer.json и опубликовать его в репозитории пакетов, таком как Packagist, чтобы другие также могли его использовать.

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

Не стесняйтесь Подписаться, чтобы получить больше подобного контента 🔔, аплодировать 👏🏻 , комментировать💬 и поделиться статьей с кем хочешь

И, как всегда, я ценю вашу поддержку и спасибо за чтение.