【问题标题】:Laravel package trait not found未找到 Laravel 包特征
【发布时间】:2017-01-12 11:09:28
【问题描述】:

我正在开发一个包,并在我的 PSR-4 结构中添加了一个“Traits”目录,这反映在包的 composer.json 中。

{
    "name": "my-private-repo/prefs",
    "description": "Preferences package.",
    "type": "package",
    "keywords": [
        "prefs",
        "preferences"
    ],
    "require": {
        "php": ">=5.5.9",
        "illuminate/support": "5.2.*",
        "laravelcollective/html": "5.2.*",
        "anahkiasen/former": "~4"
    },
    "autoload": {
        "classmap": [
            "src/controllers",
            "src/models"
        ],
        "psr-4": {
            "MyPrivateRepo\\Prefs\\": "src/"
        },
        "files": [
            "src/Prefs/helpers.php"
        ]
    },
    "minimum-stability": "dev",
    "prefer-stable": true
}

src/ 目录中是这个结构:

Prefs/
    Traits/
        HasPrefs.php
    Prefs.php
    PrefsServiceProvider.php
    helpers.php

这里是HasPrefs.php的内容:

namespace MyPrivateRepo\Prefs\Traits;

use MyPrivateRepo\Prefs\Prefs;

trait HasPrefs
{
    public function prefs($key = null, $value = null)
    {
        //...do pref related stuff here...
    }
}

我已经加载了私有项目,直接调用Prefs 类时一切正常。然后我决定测试将HasPrefs trait 添加到我的User 模型中:

namespace App;

use Cartalyst\Sentinel\Users\EloquentUser;
use Illuminate\Database\Eloquent\SoftDeletes;
use Illuminate\Auth\Authenticatable;
use Illuminate\Auth\Passwords\CanResetPassword;
use Illuminate\Foundation\Auth\Access\Authorizable;
use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract;
use Illuminate\Contracts\Auth\Access\Authorizable as AuthorizableContract;
use Illuminate\Contracts\Auth\CanResetPassword as CanResetPasswordContract;
use MyPrivateRepo\Prefs\Traits\HasPrefs;

class User extends EloquentUser implements
    AuthenticatableContract,
    AuthorizableContract,
    CanResetPasswordContract
{
    use SoftDeletes,
        Authenticatable,
        Authorizable,
        HasPrefs,
        CanResetPassword;

    //...do lots of user related stuff here...
}

现在,每次我尝试做任何事情时,都会收到此错误:

[Symfony\Component\Debug\Exception\FatalErrorException]
Trait 'MyPrivateRepo\Prefs\Traits\HasPrefs' not found

然后我执行了composer update,但在到达运行php artisan optimize 的脚本部分时遇到了与上述相同的错误。

我在User 中注释掉了对HasPrefs 的引用,然后重新运行artisan optimize,它没有问题。

未注释 HasPrefs 并且一切都按预期工作,没有错误...直到下一次我需要在项目上再次运行 composer update。然后,我又不得不再次注释掉对HasPrefs 的引用并手动运行artisan optimize

鉴于这是需要部署到生产服务器的东西,我不能在每次自动部署触发composer updatecomposer install 时手动编辑使用此特征的每个文件。

我尝试了以下方法来解决这个问题,但没有成功:

  • 工匠清除缓存
  • 作曲家自我更新
  • 作曲家清除 && 作曲家更新 -o
  • 再次注释掉 HasPrefs 后:artisan clear-compiled && artisan optimize
  • rm composer.lock && composer update -o
  • rm -rf vendor/* && composer install

如果上述任何方法暂时解决了问题,只需一次调用 composer update 即可再次解决问题。

有什么想法吗?

【问题讨论】:

    标签: php laravel composer-php


    【解决方案1】:

    如您所见:

    "psr-4": {
        "MyPrivateRepo\\Prefs\\": "src/"
    },
    

    您将 src 目录指向 MyPrivateRepo\Prefs 命名空间。因此,当您想在名为 Traits 的目录中使用此 trait 时,您的命名空间应如下所示:

    MyPrivateRepo\Prefs\Prefs\Traits
    

    因为你也有一个 Prefs,所以你在这个 trait 中的 use 语句看起来像:

     use MyPrivateRepo\Prefs\Prefs\Prefs;
    

    我的建议是更改作曲家的条目:

    "psr-4": {
        "MyPrivateRepo\\": "src/"
    },
    

    【讨论】:

    • 我在执行"MyPrivateRepo\\": "src/" 时遇到的问题是来自同一个私有仓库的多个其他包。所有这些其他包都具有相同类型的 PSR-4 声明。例如,我还有另一个 composer.json,它有 "MyPrivateRepo\\SDK\\": "src/"
    • 如果你想使用两个作曲家,你不应该在一个 src 上使用它们。尝试将其拆分到其他包到 anthor 目录中,例如:MyPrivateRepo/Sdk/src/...MyPrivateRepo/Prefs/src/...
    • Greate ,因此您可以从 src 内部删除 Prefs 导演(因此所有目录都将直接在 src 内)。你必须了解PSR-4,它是这样工作的。
    • 它们在不同的目录中,但在同一个父my-private-repo供应商目录下。例如,"MyPrivateRepo\\Prefs\\": "src/" 对应于vendor/my-private-repo/prefs/src"MyPrivateRepo\\SDK\\": "src/" 对应于vendor/my-private-repo/sdk/src
    • 明白了。会试一试! (仅供参考,我打算编辑时不小心删除了之前的评论。)
    猜你喜欢
    • 1970-01-01
    • 2016-09-27
    • 2020-07-06
    • 2015-06-19
    • 2019-07-12
    • 2017-07-28
    • 1970-01-01
    • 2020-02-24
    • 2016-08-16
    相关资源
    最近更新 更多