Создайте собственный пакет с фасадом в Laravel 8

Я пытаюсь разработать новый пакет Laravel, локально установленный через Composer.

Это мои шаги:

  • Я устанавливаю новое приложение Laravel с помощью composer create-project laravel/laravel my-application

  • Я создаю новый каталог в корне со следующим содержимым:

    packages/randolf/custom-package/composer.json

    {
        "name": "randolf/custom-package",
        "description": "My new Custom Package",
        "type": "library",
        "license": "MIT",
        "require": {},
        "autoload": {
            "psr-4": {
                "Randolf\\CustomPackage\\" : "src/"
            }
        },
        "extra": {
            "laravel": {
                "providers": [
                    "Randolf\\CustomPackage\\CustomPackageServiceProvider"
                ],
                "aliases": {
                    "CustomPackage": "Randolf\\CustomPackage\\Facades"
                }
            }
        }
    }
    

    packages/randolf/custom-package/src/CustomPackage.php

    <?php
    
    namespace Randolf\CustomPackage;
    
    class CustomPackage
    {
        public function sayHi()
        {
            return "Hi from class!";
        }
    }
    

    packages/randolf/custom-package/src/CustomPackageServiceProvider.php

    <?php
    
    namespace Randolf\CustomPackage;
    
    use Illuminate\Support\ServiceProvider;
    
    class CustomPackageServiceProvider extends ServiceProvider
    {
        public function boot()
        {
    
        }
    
        public function register()
        {
            $this->app->bind('custom-package', function()
            {
                return new CustomPackage();
            });
        }
    }
    

    packages/randolf/custom-package/src/Facades/CustomPackageFacade.php

    <?php
    
    namespace Randolf\CustomPackage\Facades;
    
    use Illuminate\Support\Facades\Facade;
    
    class CustomPackageFacade extends Facade
    {
    
        /**
        * Get the registered name of the component.
        *
        * @return string
        */
        protected static function getFacadeAccessor() { return 'custom-package'; }
    }
    
  • Я добавляю свой пакет в Laravel с помощью composer, добавляя ключ repositories: /composer.json

    "repositories": {
        "randolf/custom-package": {
            "type": "path",
            "url": "packages/randolf/custom-package",
            "options": {
                "symlink": true
            }
        }
    },
    "require": {
        ...
        "randolf/custom-package": "@dev"
    },
    
  • Я запускаю composer update, и установка, обнаружение пакетов и автозагрузка дампа работают правильно:

    Loading composer repositories with package information
    Updating dependencies
    Lock file operations: 1 install, 0 updates, 0 removals
    - Locking randolf/custom-package (dev-master)
    Writing lock file
    Installing dependencies from lock file (including require-dev)
    Package operations: 1 install, 0 updates, 0 removals
    - Installing randolf/custom-package (dev-master): Junctioning from packages/randolf/custom-package
    Generating optimized autoload files
    > Illuminate\Foundation\ComposerScripts::postAutoloadDump
    > @php artisan package:discover --ansi
    Discovered Package: facade/ignition
    Discovered Package: fideloper/proxy
    Discovered Package: fruitcake/laravel-cors
    Discovered Package: laravel/sail
    Discovered Package: laravel/tinker
    Discovered Package: nesbot/carbon
    Discovered Package: nunomaduro/collision
    Discovered Package: randolf/custom-package
    Package manifest generated successfully.
    73 packages you are using are looking for funding.
    Use the `composer fund` command to find out more!
    
  • Я создаю маршрут в routes/web.php для проверки фасада:

    Route::get('/test-facade', function () {
        echo CustomPackage::sayHi();
    });
    

Результат:

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

lagbox 22.12.2020 12:05

🤦‍♂️🤦‍♂️🤦‍♂️🤦‍♂️🤦‍♂️🤦‍♂️ Проверено и работает. Если вы ответите как ответ, я смогу принять его. Большое спасибо!!

Randolf 22.12.2020 12:17

Хороший учебник! Но вы вызываете свой метод sayHi() как статический, поэтому вам нужно определить его как статический: public function sayHi()public static function sayHi().

DevonDahon 11.02.2021 17:03

Почему вы устанавливаете $this->app->bind в методе register() вашего провайдера? Не использовать его, кажется, тоже работает нормально...

DevonDahon 12.02.2021 10:14

@DevonDahon это функция под названием Facades в Laravel. Вы можете вызывать нестатический метод как статический метод. Сначала привяжите новый экземпляр вашего класса в провайдере с именем (custom-package в этом примере). Затем создайте фасад, который возвращает это же имя (CustomPackageFacade и, следовательно, экземпляр вашего класса), и, наконец, вы регистрируете псевдоним для фасада в своем composer.json. Таким образом, вы называете CustomPackage::sayHi(), что это то же самое, что и (new CustomPackage())->sayHi(). Подробнее: laravel.com/docs/master/facades

Randolf 12.02.2021 11:02
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
3
5
2 056
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Измените псевдоним в composer.json, чтобы он указывал на фасад, а не на его пространство имен:

"CustomPackage": "Randolf\\CustomPackage\\Facades\\CustomPackageFacade"

Другие вопросы по теме