【发布时间】: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->app->bind?不使用它似乎也可以正常工作...... -
@DevonDahon 这是 Laravel 中称为
Facades的功能。您可以将非静态方法称为静态方法。首先在提供程序中绑定一个新的类实例,并带有一个名称(在本例中为custom-package)。然后,创建返回相同名称的 Facade(CustomPackageFacade,因此是您的类的实例),最后,您在composer.json中注册 Facade 并为其命名。因此,您调用CustomPackage::sayHi()与(new CustomPackage())->sayHi()相同。更多信息:laravel.com/docs/master/facades
标签: php laravel package laravel-facade