定时任务代码使用注解依赖注入的数据库模型会报错,只能使用构造函数的方式进行依赖注入
class Task
{
public function onWorkerStart()
{
//调用模型查询
$taskList = (new Crontab())->select();
foreach ($taskList as $item) {
new Crontab($item->rule, function () use ($item) {
$this->run($item);
});
}
}
public function run($args)
{
echo $args->name.'任务开始调用:'.date('Y-m-d H:i:s')."\n";
//执行定时任务
$service = new CrontabService();
$result = $service->run($args->id);
if ($result) {
echo $args->name.'任务调用成功:'.date('Y-m-d H:i:s')."\n";
} else {
echo $args->name.'任务调用失败:'.date('Y-m-d H:i:s')."\n";
}
}
}
class CrontabService extends BaseService
{
//只能用构造函数,可以正常执行
public function __construct()
{
$this->model = new Crontab();
}
//注解注入会报find方法找不到错误
/**
* @Inject
* @var Crontab
*/
protected $model;
public function run($id)
{
//THINK ORM find方法查询
$info = $this->model->find($id);
...
}
}
必须是由框架或者php-di创建的实例才能完成依赖自动注入,手动new的实例无法完成依赖自动注入,如需注入,需要使用support\Container接口替换new语句
文档说的,自己new的类不支持注入
你的代码明显是自己new的,不是容器创建的