未找到Laravel包特征

时间:2016-09-05 05:40:59

标签: php laravel composer-php

我正在开发一个包并在我的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特征添加到我的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的脚本部分时遇到了与上面相同的错误。

我在HasPrefs中注释了对User的引用,并重新运行了artisan optimize,这些内容毫无问题。

取消注释HasPrefs并且所有内容都按预期运行且没有错误......直到下次我需要在项目上再次运行composer update。然后,我又回到必须再次评论对HasPrefs的引用并手动运行artisan optimize

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

我已尝试以下方法解决此问题但未成功:

  • artisan clear-cache
  • composer self-update
  • 作曲家清晰&&作曲家更新-o
  • 再次评论出HasPrefs:artisan clear-compiled&&工匠优化
  • rm composer.lock&&作曲家更新-o
  • rm -rf vendor / *&&作曲家安装

如果以上任何一项暂时解决问题,只需拨打一次composer update就可以将其重新打破。

这里有什么问题吗?

1 个答案:

答案 0 :(得分:5)

正如你在这里看到的那样:

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

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

MyPrivateRepo\Prefs\Prefs\Traits

因为您还有Prefs,所以此特征中的use语句将如下所示:

 use MyPrivateRepo\Prefs\Prefs\Prefs;

我的建议是改变作曲家的参赛作品:

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