我正在开发一个包,并在我的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 MyPrivateRepoPrefsTraits;
use MyPrivateRepoPrefsPrefs;
trait HasPrefs
{
public function prefs($key = null, $value = null)
{
//...do pref related stuff here...
}
}
我已经加载了私人项目,当直接调用Prefs
类时,一切都很好。然后我决定测试将HasPrefs
特性添加到我的User
模型中:
namespace App;
use CartalystSentinelUsersEloquentUser;
use IlluminateDatabaseEloquentSoftDeletes;
use IlluminateAuthAuthenticatable;
use IlluminateAuthPasswordsCanResetPassword;
use IlluminateFoundationAuthAccessAuthorizable;
use IlluminateContractsAuthAuthenticatable as AuthenticatableContract;
use IlluminateContractsAuthAccessAuthorizable as AuthorizableContract;
use IlluminateContractsAuthCanResetPassword as CanResetPasswordContract;
use MyPrivateRepoPrefsTraitsHasPrefs;
class User extends EloquentUser implements
AuthenticatableContract,
AuthorizableContract,
CanResetPasswordContract
{
use SoftDeletes,
Authenticatable,
Authorizable,
HasPrefs,
CanResetPassword;
//...do lots of user related stuff here...
}
现在,每次我尝试做任何事情,我得到这个错误:
[SymfonyComponentDebugExceptionFatalErrorException]
Trait 'MyPrivateRepoPrefsTraitsHasPrefs' not found
然后我做了composer update
,但当它到达运行php artisan optimize
的脚本部分时,得到了与上面相同的错误。
我在User
中注释掉了对HasPrefs
的引用,并重新运行了artisan optimize
,没有问题。
未注释的HasPrefs
和所有的工作如预期的没有错误…直到下次我需要在项目上再次运行composer update
。然后,我又不得不再次注释掉对HasPrefs
的引用,并手动运行artisan optimize
。
考虑到这是需要部署到生产服务器的东西,我不能在每次有自动部署触发的composer update
或composer install
时手动编辑使用该特性的每个文件。
我尝试了以下方法来解决这个问题,但没有成功:
- 工匠clear-cache
- 作曲家的由来
- composer clear &&作曲器更新- 0 在再次注释掉HasPrefs之后:artisan clear-compiled &&工匠优化
- rm作曲家。锁,,作曲器更新- 0
- rm -rf vendor/* &&作曲家安装
如果上述任何一种方法暂时解决了问题,则只需调用composer update
即可再次打破它。
你知道这是怎么回事吗?
如图所示:
"psr-4": {
"MyPrivateRepo\Prefs\": "src/"
},
将src
dir指定为MyPrivateRepoPrefs
命名空间。所以当你想在目录Traits
中使用这个特性时你的命名空间应该是这样的:
MyPrivateRepoPrefsPrefsTraits
因为你也有一个Prefs
,所以你的use
语句在这个特质中看起来像:
use MyPrivateRepoPrefsPrefsPrefs;
我的建议是将作曲家的条目更改为:
"psr-4": {
"MyPrivateRepo\": "src/"
},