我正在开发一个包并在我的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 update
或composer install
触发时,我都无法手动编辑每个使用此特征的文件。自动部署。
我已尝试以下方法解决此问题但未成功:
如果以上任何一项暂时解决问题,只需拨打一次composer update
就可以将其重新打破。
这里有什么问题吗?
答案 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/"
},