【问题标题】:How to use Laravel package in my own package?如何在我自己的包中使用 Laravel 包?
【发布时间】:2019-12-06 21:17:25
【问题描述】:

我正在 Laravel 中开发一个 Role-Permission 包,我想使用这个包;

Laravel permission github

问题是当我在自己的包中安装这个包时,我无法使用主项目中的某些功能。例如“HasRoles”

我的包 composer.json 文件

 "require": {
        "spatie/laravel-permission": "dev-master"
    },
    "autoload": {
        "psr-4": {
            "Modul\\Permission\\": "src"
        }
    },
    "extra": {
        "laravel": {
            "providers": [
                "Spatie\\Permission\\PermissionServiceProvider"
            ]
        }
    }

主项目作曲家文件

{
    "name": "laravel/laravel",
    "type": "project",
    "description": "The Laravel Framework.",
    "keywords": [
        "framework",
        "laravel"
    ],
    "license": "MIT",
    "require": {
        "php": "^7.1.3",
        "fideloper/proxy": "^4.0",
        "laravel/framework": "5.8.*",
        "laravel/tinker": "^1.0"
    },
    "require-dev": {
        "beyondcode/laravel-dump-server": "^1.0",
        "filp/whoops": "^2.0",
        "fzaninotto/faker": "^1.4",
        "mockery/mockery": "^1.0",
        "nunomaduro/collision": "^3.0",
        "phpunit/phpunit": "^7.5"
    },
    "config": {
        "optimize-autoloader": true,
        "preferred-install": "dist",
        "sort-packages": true
    },
    "extra": {
        "laravel": {
            "dont-discover": []
        }
    },
    "autoload": {
        "psr-4": {
            "App\\": "app/",
            "Modul\\Permission\\": "packages/modul/permission/src"
        },
        "classmap": [
            "database/seeds",
            "database/factories"
        ]
    },
    "autoload-dev": {
        "psr-4": {
            "Tests\\": "tests/"
        }
    },
    "minimum-stability": "dev",
    "prefer-stable": true,
    "scripts": {
        "post-autoload-dump": [
            "Illuminate\\Foundation\\ComposerScripts::postAutoloadDump",
            "@php artisan package:discover"
        ],
        "post-root-package-install": [
            "@php -r \"file_exists('.env') || copy('.env.example', '.env');\""
        ],
        "post-create-project-cmd": [
            "@php artisan key:generate --ansi"
        ]
    }
}

还有我的用户模型;

use Illuminate\Notifications\Notifiable;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Spatie\Permission\Traits\HasRoles;

class User extends Authenticatable
{
    use Notifiable;
    use HasRoles;

当我服务它时显示此错误消息...

Symfony\Component\Debug\Exception\FatalErrorException (E_UNKNOWN) 未找到特征“Spatie\Permission\Traits\HasRoles”

我在这里做错了什么?

[1]: https://i.stack.imgur.com/KRUT0.png

【问题讨论】:

  • 你安装了这个包吗?如果您只是手动更改了composer.json,那么您需要为 Composer 执行 composer update 以将其安装到您的供应商文件夹中。
  • 我使用“composer 需要 spatie/laravel-permission” 命令
  • 您是否正在为使用您的包的 laravel 项目或需要 vendor/autoload.php 的某些脚本提供服务?
  • 也许在作曲家转储其自动加载文件之前发生了一些事情。手动尝试composer dump-autoload。只是为了确定
  • @EmreCanbulat 您项目的其中一个包已更新。您需要为您的项目提取这些更新。为您的项目执行composer update yourpackage/name(或一般composer update,为项目带来新的变化和新的依赖。

标签: php laravel laravel-5 package composer-php


【解决方案1】:

问题是您只是将包文件自动加载到您的项目中。这样,您的项目的作曲家就不会知道您的包的依赖项(因此为什么没有安装 spatie/permission 包)。

执行此操作的正确方法是将您的包要求到您的项目中。通常你会为你的项目创建一个仓库,在https://packagist.org注册为modul/permission,然后为你的项目运行composer require modul/permission

但是如果你的包还没有完全开发,我建议你不要从 packagist 那里要求它,而是从所谓的path repository 那里要求它。在项目的 composer.json 中添加以下部分:

{
...
    "repositories": [
        {
            "type": "path",
            "url": "packages/modul/permission"
        },
    ]
...
}

这将使 composer 在您需要时查看您的包的 packages/modul/permission 目录。所以这样做并从项目的composer.json 中删除包源文件的手动自动加载(composer 将使用包的自动加载部分将/src 绑定到Module\Permission 命名空间):

"psr-4": {
     "App\\": "app/",
     "Modul\\Permission\\": "packages/modul/permission/src" <--- remove this line
}

最后,运行composer require modul/permission。 Composer 将在我们为他指定的路径存储库中找到它,并将 packages/modul/permission 目录符号链接到 vendor/modul/permission 并安装它的依赖项。

现在您可以在packages/modul/permission 文件夹中编辑您的包。完成后,请务必在 github/packagist 上在线发布它,以便它可以从 packagist 存储库远程提供给所有人,而不仅仅是从您的本地路径之一。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-18
    • 1970-01-01
    • 2019-03-08
    • 2021-09-09
    • 1970-01-01
    相关资源
    最近更新 更多