【问题标题】:Create custom package with facade in Laravel 8在 Laravel 8 中创建带有外观的自定义包
【发布时间】:2021-04-01 02:05:55
【问题描述】:

我正在尝试开发一个通过 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 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 文件中添加别名的命名空间...您为命名空间而不是外观本身起别名
  • ????‍♂️????‍♂️????‍♂️????‍♂️????‍♂️????‍♂️经过测试和工作。如果您作为答案回复,我将能够接受。非常感谢!!
  • 不错的教程!但是您将方法 sayHi() 调用为静态的,因此您需要将其定义为静态:public function sayHi()public static function sayHi()
  • 为什么要在提供者的register() 方法中设置$this-&gt;app-&gt;bind?不使用它似乎也可以正常工作......
  • @DevonDahon 这是 Laravel 中称为 Facades 的功能。您可以将非静态方法称为静态方法。首先在提供程序中绑定一个新的类实例,并带有一个名称(在本例中为custom-package)。然后,创建返回相同名称的 Facade(CustomPackageFacade,因此是您的类的实例),最后,您在 composer.json 中注册 Facade 并为其命名。因此,您调用CustomPackage::sayHi()(new CustomPackage())-&gt;sayHi() 相同。更多信息:laravel.com/docs/master/facades

标签: php laravel package laravel-facade


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2014-11-16
    • 2012-12-19
    • 1970-01-01
    • 2021-08-29
    • 1970-01-01
    • 2015-12-29
    • 2021-12-31
    • 1970-01-01
    • 2015-06-03
    相关资源
    最近更新 更多