You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Nette框架搭配Nextras/ORM包时遇到错误:注入到处理器的模型对象始终为null

Nette框架搭配Nextras/ORM包时遇到错误:注入到处理器的模型对象始终为null

兄弟,我之前踩过一模一样的坑!你说的这个注入的模型/Repository一直为null的问题,大概率是依赖注入(DI)这块的配置没理顺,咱们一个个排查:

  • 首先得确保处理器是由Nette的DI容器实例化的,不是你自己new的
    用tomaj/nette-api的时候,很多人图省事直接在路由里写new YourApiProcessor(),但这样DI容器根本没机会给你注入依赖啊!正确的做法是在路由里传处理器的类名,让DI自动实例化:

    $apiRouter = new Tomaj\Api\ApiRouter();
    // 重点:传类名,不是直接new实例!
    $apiRouter->addRoute('POST', '/your-endpoint', YourApiProcessor::class);
    
  • 然后检查依赖注入的方式对不对
    别纠结@inject注解了(不是说不能用,只是构造函数注入更清晰,也不容易出问题),直接给处理器的构造函数加对应参数就行:

    class YourApiProcessor implements Tomaj\Api\Handler\HandlerInterface
    {
        private $yourRepo;
    
        // 注意:这里注入的应该是Nextras的Repository类,不是实体类哦!
        public function __construct(App\Model\YourRepository $yourRepo)
        {
            $this->yourRepo = $yourRepo;
        }
    
        public function handle(Tomaj\Api\Request $request): Tomaj\Api\ResponseInterface
        {
            // 这里用$this->yourRepo就不会是null了
            $postData = $request->getPost();
            $newEntity = $this->yourRepo->create($postData);
            $this->yourRepo->persistAndFlush($newEntity);
            return new Tomaj\Api\JsonResponse(['status' => 'success'], 201);
        }
    }
    
  • 接着核对Nextras/ORM的配置有没有到位
    得在config.neon里把Nextras ORM的扩展加上,还要配置好命名空间映射,不然DI容器根本不知道你的Repository和实体存在:

    extensions:
        orm: Nextras\Orm\Bridges\Nette\DI\OrmExtension
    
    orm:
        mapping:
            App\Model: App\Model # 你的实体和Repository所在的命名空间
        dbal:
            driver: mysqli
            host: localhost
            database: your_database_name
            user: your_db_user
            password: your_db_password
    

    另外,你的Repository类得正确继承Nextras的基类,还要指定对应的实体:

    namespace App\Model;
    
    use Nextras\Orm\Repository\Repository;
    
    class YourRepository extends Repository
    {
        public static function getEntityClassNames(): array
        {
            return [YourEntity::class]; // 关联你的实体类
        }
    }
    
  • 最后确认处理器和Repository都被DI容器识别了
    你可以在config.neon的services段里开启自动注册,把处理器和Repository所在的命名空间加进去,让DI自动扫描并注册为服务:

    services:
        - App\Api\Handler\* # 你的API处理器所在的命名空间
        - App\Model\* # 你的Repository和实体所在的命名空间
    

我当初就是因为手贱new了处理器,折腾了一下午才发现问题所在,按上面的步骤挨个排查,应该就能解决模型/Repository为null的问题了!

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.08 12:58:05