php Laravel没有发现我正在开发的软件包

aoyhnmkz  于 2023-03-11  发布在  PHP
关注(0)|答案(2)|浏览(150)

我正在开发一个软件包,但不知何故,我无法使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它不加载我的包?我错过了哪一步或者问题出在哪里?

mspsb9vt

mspsb9vt1#

因此,您的包的composer.json应该如下所示:

{
    "name": "troyerx/statusmanager",
    "description": "Simple model status manager",
    "license": "MIT",
    "version": "1.0.0",
    "keywords": [
        "troyerx",
        "php",
        "statusmanager"
    ],
    "authors": [
        {
            "name": "Sergio",
            "email": "email@gmail.com"
        }
    ],
    "require": {
        "laravel/framework": "^10.0"
    },
    "autoload": {
        "psr-4": {
            "Troyerx\\Statusmanager\\": "src/"
        }
    }
}

看我有:

  • 添加了一个require(Laravel框架),所以它依赖于Laravel(如果它是纯PHP,请删除它)
  • 我还添加了version,这样您就可以跟踪版本,而且更容易

您的主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",
        "troyerx/statusmanager": "^1.0"
    },
    "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/",
            "Database\\Factories\\": "database/factories/",
            "Database\\Seeders\\": "database/seeders/"
        }
    },
    "autoload-dev": {
        "psr-4": {
            "Tests\\": "tests/"
        }
    },
    "repositories": [
        {
            "type": "path",
            "url": "packages/"
        },
    ],
    "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
}

我有:

  • 已从autoloadautoload-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软件包,你不应该把databasefactories放在src里面,而应该放在外面,然后把这个软件包的composer.json做成这样:

{
    "name": "troyerx/statusmanager",
    "description": "Simple model status manager",
    "license": "MIT",
    "version": "1.0.0",
    "keywords": [
        "troyerx",
        "php",
        "statusmanager"
    ],
    "authors": [
        {
            "name": "Sergio",
            "email": "email@gmail.com"
        }
    ],
    "require": {
        "laravel/framework": "^10.0"
    },
    "autoload": {
        "psr-4": {
            "Troyerx\\Statusmanager\\": "src/",
            "Troyerx\\Statusmanager\\Database\\Factories\\": "database/factories/",
            "Troyerx\\Statusmanager\\Database\\Seeders\\": "database/seeders/"
        }
    }
}

您需要拥有自己的ServiceProvider,并将其添加到包的composer extra -> laravel部分,如下所示:https://github.com/barryvdh/laravel-ide-helper/blob/4dc20b028adaeadf603860f179f09da5aa21f5b5/composer.json#L70-L74
使用该开发包作为如何实现您自己包的指南,它看起来应该非常相似(至少对于您的文件,但结构明智)。
使用Laravel Jetstream(例如)来查看如何加载迁移。请将其作为示例。
请记住,所有的Laravel软件包都像这2个,所以如果你知道一个软件包,去github看看它的结构是has和它在composer.json中有什么,等等。

g9icjywg

g9icjywg2#

我已经找到了解决方案,让Laravel在我运行composer dump-autoload时发现/安装我的软件包。
在应用程序composer.json中,我补充道:

"repositories": [
    {
        "type": "path",
        "url": "packages/troyerx/statusmanager",
        "options": {
            "symlink": true
        }
    }
],

并在require-dev中添加下一行:

"require-dev": {
    ...
    "troyerx/statusmanager": "@dev"
},

运行composer update后,发现软件包:

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
troyerx/statusmanager ....................................................................................................................... DONE

相关问题