官方提供的有两种情况,可以参见官网,除了官网的情况,如果仍旧遇到这类error,可以运行以下命令
composer dump-autoload -o
即可解决
还有一种情况,如果在unix系统环境下,route.php文件的类路径大小写不正确的情况,也会导致产生报错。
Inject
或 Value
注解不生效2.0
使用了构造函数中注入 Inject
和 Value
的功能,以下两种场景,可能会导致注入失效,请注意使用。
原类没有使用 Inject
或 Value
,但父类使用了 Inject
或 Value
,且原类写了构造函数,同时又没有调用父类构造函数的情况。
这样就会导致原类不会生成代理类,而实例化的时候又调用了自身的构造函数,故没办法执行到父类的构造函数。 所以父类代理类中的方法 __handlePropertyHandler
就不会执行,那么 Inject
或 Value
注解就不会生效。
class ParentClass { /** * @Inject * @var Service */ protected $value; } class Origin extends ParentClass { public function __construct() {} }Copy to clipboardErrorCopied
原类没有使用 Inject
或 Value
,但 Trait
中使用了 Inject
或 Value
。
这样就会导致原类不会生成代理类,故没办法执行构造函数里的 __handlePropertyHandler
,所以 Trait
的 Inject
或 Value
注解就不会生效。
trait OriginTrait { /** * @Inject * @var Service */ protected $value; } class Origin { use OriginTrait; }Copy to clipboardErrorCopied
基于上述两种情况,可见 原类
是否生成代理类至关重要,所以,如果使用了带有 Inject
或 Value
的 Trait
和 父类
时,给原类添加一个 Inject
,即可解决上述两种情况。
use Hyperf\Contract\StdoutLoggerInterface; trait OriginTrait { /** * @Inject * @var Service */ protected $trait; } class ParentClass { /** * @Inject * @var Service */ protected $value; } class Origin extends ParentClass { use OriginTrait; /** * @Inject * @var StdoutLoggerInterface */ protected $logger; }
作者:cc卡耐基
链接:https://www.jianshu.com/p/cff8a6d40198
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
有话要说