定时任务无法使用注解依赖注入

leung

问题描述

定时任务代码使用注解依赖注入的数据库模型会报错,只能使用构造函数的方式进行依赖注入

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);

        ...
    }

}
276 1 0
1个回答

yongdao35

必须是由框架或者php-di创建的实例才能完成依赖自动注入,手动new的实例无法完成依赖自动注入,如需注入,需要使用support\Container接口替换new语句

文档说的,自己new的类不支持注入

//执行定时任务
$service = new CrontabService();

你的代码明显是自己new的,不是容器创建的

  • 暂无评论
×
🔝