使用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
相关产品推荐
相关产品推荐

