在 Laravel 8 中创建带有外观的自定义包

问题描述

我正在尝试开发一个通过 Composer 本地安装的新 Laravel 包。

这些是我的步骤:

  • 我用 composer create-project laravel/laravel my-application

    安装了一个新的 Laravel 应用程序
  • 我在根目录中创建了一个包含以下内容的新目录:

    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'; }
    }
    
  • 我使用 composer 在 Laravel 中添加我的包,添加 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 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();
    });
    

结果:

laravel facade error

解决方法

调整 composer.json 中的别名以指向 Facade 而不是其命名空间:

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