关于 Laravel 在 public/index.php 入口文件实例一个 model 对象,为何查找数据失败,连接解析器为 null?
问题由来
为了了解laravel一个model的操作数据的全过程,为加入redis缓存做准备,想跳过请求解析阶段,直接调试model(容器加载之后很方便就能实例一个model)。
我已查阅相关论坛以及社区,并没有找到有类似问题以及解答,接下来就自己对框架的了解来步步调试的过程。
代码如下:
<?php
define('LARAVEL_START', microtime(true));
require __DIR__.'/../vendor/autoload.php';
$app = require_once __DIR__.'/../bootstrap/app.php';
----------------------------------------------看这里,添加这两行代码
// 1. 实例一个usermodel
$user = app(Modules\User\Models\User::class);
// 2. 直接用这个model去操作数据库,得到users表的所有数据列表
var_dump($user::all());die;
---------------------------------------------美丽的分割线
$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);
$response = $kernel->handle(
$request = Illuminate\Http\Request::capture()
);
$response->send();
$kernel->terminate($request, $response);
容器解析一个usermodel是没问题的,但是在查询数据库时,就报错了Uncaught Error: Call to a member function connection() on null in D:\xampp\htdocs\niua\vendor\laravel\framework\src\Illuminate\Database\Eloquent\Model.php:1144 Stack trace: #0
看到提示,我打印了容器解析的 $user 对象,发现对象中 "connection":protected]=> NULL"
connection这个受保护的属性为空,所以,我直接调用 model 基类的 setConnection() 函数手动设置 connection ,代码如下:
$user = app(Modules\User\Models\User::class);
$user->setConnection('mysql');
var_dump($user::all());die;
结果没什么卵用,再看源代码,发现 all() 是个 static 方法:
public static function all($columns = ['*'])
{
// TMD,他是直接 new static
return (new static)->newQuery()->get(
is_array($columns) ? $columns : func_get_args()
);
}
所以,我直接在 all() 方法修改:
public static function all($columns = ['*'])
{
// 在这里手动设置连接数据库类型
return (new static)->setConnection('mysql')->newQuery()->get(
is_array($columns) ? $columns : func_get_args()
);
}
结果报错了,根据提示,看了下框架,发现 连接解析器 resolver
这个东西我压根就没有加载:
/**
* Set the connection resolver instance.
* 设置连接解析器实例
*
* @param \Illuminate\Database\ConnectionResolverInterface $resolver
* @return void
*/
public static function setConnectionResolver(Resolver $resolver)
{
var_dump(static::$resolver);die;// 输出为null
static::$resolver = $resolver;
}
想想不对啊,这个 setConnectionResolver() 函数的 Resolver 依赖为什么laravel容器的反射没给我注入进来?????
到这里,我就已经懵逼了,laravel对我来说是一个新的方向,刚学laravel没多久,求各位路过的朋友帮下忙哈,谢谢laravel中国社区平台。
推荐文章: