Я пытаюсь разработать новый пакет 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();
});
Результат:
🤦♂️🤦♂️🤦♂️🤦♂️🤦♂️🤦♂️ Проверено и работает. Если вы ответите как ответ, я смогу принять его. Большое спасибо!!
Хороший учебник! Но вы вызываете свой метод sayHi()
как статический, поэтому вам нужно определить его как статический: public function sayHi()
⇒ public static function sayHi()
.
Почему вы устанавливаете $this->app->bind
в методе register()
вашего провайдера? Не использовать его, кажется, тоже работает нормально...
@DevonDahon это функция под названием Facades
в Laravel. Вы можете вызывать нестатический метод как статический метод. Сначала привяжите новый экземпляр вашего класса в провайдере с именем (custom-package
в этом примере). Затем создайте фасад, который возвращает это же имя (CustomPackageFacade
и, следовательно, экземпляр вашего класса), и, наконец, вы регистрируете псевдоним для фасада в своем composer.json
. Таким образом, вы называете CustomPackage::sayHi()
, что это то же самое, что и (new CustomPackage())->sayHi()
. Подробнее: laravel.com/docs/master/facades
Измените псевдоним в composer.json
, чтобы он указывал на фасад, а не на его пространство имен:
"CustomPackage": "Randolf\\CustomPackage\\Facades\\CustomPackageFacade"
вы забыли добавить имя класса вашего фактического фасада в пространство имен, где вы добавляете псевдоним в файле composer.json... вы указали псевдоним пространства имен, а не самого фасада