我正在开发一个软件包,但不知何故,我无法使Laravel发现它。
Package位于应用程序的根目录下,并遵循以下结构:
文件:
状态管理器.php
<?php
namespace Troyerx\StatusManager;
trait StatusManager {
//Code
}
包/troyerx/状态管理器中的Composer.json**
{
"name": "troyerx/statusmanager",
"description": "Simple model status manager",
"license": "MIT",
"keywords": [
"troyerx",
"php",
"statusmanager"
],
"authors": [
{
"name": "Sergio",
"email": "email@gmail.com"
}
],
"autoload": {
"psr-4": {
"Troyerx\\Statusmanager\\": "src/"
}
},
"require": {}
}
我的应用composer.json看起来像:
{
"name": "laravel/laravel",
"type": "project",
"description": "The Laravel Framework.",
"keywords": ["framework", "laravel"],
"license": "MIT",
"require": {
"php": "^8.1",
"guzzlehttp/guzzle": "^7.2",
"laravel/framework": "^10.0",
"laravel/sanctum": "^3.2",
"laravel/tinker": "^2.8"
},
"require-dev": {
"fakerphp/faker": "^1.9.1",
"laravel/pint": "^1.0",
"laravel/sail": "^1.18",
"mockery/mockery": "^1.4.4",
"nunomaduro/collision": "^7.0",
"phpunit/phpunit": "^10.0",
"spatie/laravel-ignition": "^2.0"
},
"autoload": {
"psr-4": {
"App\\": "app/",
"Troyerx\\Statusmanager\\": "packages/troyerx/statusmanager/src/",
"Database\\Factories\\": "database/factories/",
"Database\\Seeders\\": "database/seeders/"
}
},
"autoload-dev": {
"psr-4": {
"Troyerx\\Statusmanager\\": "packages/troyerx/statusmanager/src/",
"Tests\\": "tests/"
}
},
"scripts": {
"post-autoload-dump": [
"Illuminate\\Foundation\\ComposerScripts::postAutoloadDump",
"@php artisan package:discover --ansi"
],
"post-update-cmd": [
"@php artisan vendor:publish --tag=laravel-assets --ansi --force"
],
"post-root-package-install": [
"@php -r \"file_exists('.env') || copy('.env.example', '.env');\""
],
"post-create-project-cmd": [
"@php artisan key:generate --ansi"
]
},
"extra": {
"laravel": {
"dont-discover": []
}
},
"config": {
"optimize-autoloader": true,
"preferred-install": "dist",
"sort-packages": true,
"allow-plugins": {
"pestphp/pest-plugin": true,
"php-http/discovery": true
}
},
"minimum-stability": "stable",
"prefer-stable": true
}
由于包被标记为在autoload上发现,所以我应该期望在运行以下命令时将其包含在内:
composer dump-autoload
但我得到了以下提示:
Generating optimized autoload files
> Illuminate\Foundation\ComposerScripts::postAutoloadDump
> @php artisan package:discover --ansi
INFO Discovering packages.
laravel/sail ................................................................................................................................ DONE
laravel/sanctum ............................................................................................................................. DONE
laravel/tinker .............................................................................................................................. DONE
nesbot/carbon ............................................................................................................................... DONE
nunomaduro/collision ........................................................................................................................ DONE
nunomaduro/termwind ......................................................................................................................... DONE
spatie/laravel-ignition ..................................................................................................................... DONE
Generated optimized autoload files containing 5729 classes
如果我在模型中调用trait,它不会自动加载
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Troyerx\StatusManager\StatusManager as StatusManager;
class Order extends Model
{
use StatusManager;
}
给出下一个错误:
Trait "Troyerx\StatusManager\StatusManager" not found
为什么Laravel它不加载我的包?我错过了哪一步或者问题出在哪里?
2条答案
按热度按时间mspsb9vt1#
因此,您的包的
composer.json
应该如下所示:看我有:
version
,这样您就可以跟踪版本,而且更容易您的主
composer.json
应该是这样的(我将列出我修改或添加的部分):我有:
autoload
和autoload-dev
中删除自定义命名空间require
repositories
部分,链接到应查找的文件夹因此,首先编辑软件包的composer文件,然后将
repositories
添加到主composer文件,然后使用命令行执行composer require troyerx/statusmanager:^1.0
,完成后,它将自动被选中。记住将包的composer版本(
version
部分)转换为新版本,然后在主composer中运行composer update troyerx/statusmanager
就可以了!这是我使用过的composer文档:https://getcomposer.org/doc/05-repositories.md#path
有一件事要记住:如果你正在开发一个Laravel软件包,你不应该把
database
和factories
放在src
里面,而应该放在外面,然后把这个软件包的composer.json
做成这样:您需要拥有自己的
ServiceProvider
,并将其添加到包的composerextra -> laravel
部分,如下所示:https://github.com/barryvdh/laravel-ide-helper/blob/4dc20b028adaeadf603860f179f09da5aa21f5b5/composer.json#L70-L74使用该开发包作为如何实现您自己包的指南,它看起来应该非常相似(至少对于您的文件,但结构明智)。
使用Laravel Jetstream(例如)来查看如何加载迁移。请将其作为示例。
请记住,所有的Laravel软件包都像这2个,所以如果你知道一个软件包,去github看看它的结构是has和它在
composer.json
中有什么,等等。g9icjywg2#
我已经找到了解决方案,让Laravel在我运行
composer dump-autoload
时发现/安装我的软件包。在应用程序composer.json中,我补充道:
并在require-dev中添加下一行:
运行
composer update
后,发现软件包: