【发布时间】:2014-08-20 00:45:47
【问题描述】:
无法将 Laravel 的 DB 类注入到位于另一个命名空间文件夹中的抽象类中。
出现错误“调用未定义的方法 Illuminate\Support\Facades\DB::table()”
-检查:工作- FrontController.php
<?php
use MyProject\MainPages\Front;
class indexController extends \BaseController {
/**
* @var Front
*/
private $Front;
/**
* @param ProductRepository $productRepo
*/
function __construct(Front $Front)
{
//Test
//$this->Front = $Front->goSetup();
}
}
-检查:工作- Front.php
<?php namespace MyProject\MainPages;
use MyProject\MainPages\NavigationSkeleton;
class Front extends NavigationBluPrint {
/**
* Begins the process, Step 1
*/
protected function goSetup() {
// $this->DB->table() etc
}
}
-不工作- NavigationBluPrint.php
<?php namespace MyProject\MainPages;
use \DB;
abstract class NavigationBluPrint {
/**
* @var DB Laravel Database connection
*/
protected $dB;
public function __construct(DB $dB)
{
// SetDB so when extended it's already set for extended classes
$this->dB = $dB;
// Test below
$x = $this->dB->table('products')->get(); //Error: Call to undefined method Illuminate\Support\Facades\DB::table()
echo '<pre>';
print_r($x);
echo '<pre>';
}
}
如果我需要使用 App:: 来完成这项工作,我不明白它是如何完成的。谢谢
找到的解决方案:以防其他人遇到同样的问题。
在抽象类“NavigationBluPrint.php”中
我替换了 \DB; with=> 使用 \Illuminate\Database\DatabaseManager 作为数据库;
它似乎解决了这个问题,虽然我不确定它是从一开始就实例化一个新的数据库还是使用同一个数据库。如果是前者,那就有点违背了目的。
【问题讨论】:
-
我相信
use效果只会影响声明它的脚本。如果您包含、要求或扩展具有use的脚本,则它不起作用。您应该尝试对与 DB 类相关的任何内容使用完整的命名空间。 -
@amenadiel 这就是我想使用抽象类的原因,所以我不必每次都声明它。有没有其他方法同时仍然留在同一个抽象类中?
-
我对 Laravel 不熟悉,但是用 \DB 代替 DB 似乎也不错。这是一个根类,不是吗?
-
@amenadiel 我自己是 Laravel 的新手,据我所知,它是 Laravel 原生的,使用“Facades”,我猜是根。我希望将数据库注入抽象类并将其扩展到该命名空间中的类,这些类将使用蓝图来拥有数据库。如果我更改了我的数据库,那么我将不必在 MyProject 命名空间中的 10 个不同位置更新它,而只需在一个位置进行更新。感谢您尝试
-
你仍然可以这样做。只需删除 use DB 并使用其完全合格的命名空间注入 DB。