【发布时间】: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 update 或composer 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