【问题标题】:Injecting DB class into the __constructor variable inside an Abstract Class将 DB 类注入到抽象类中的 __constructor 变量中
【发布时间】: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。

标签: php laravel laravel-4


【解决方案1】:

您是在提示 DB 类的外观,而不是 DB 类本身。

【讨论】:

  • 这周我才刚刚开始学习 Laravel。您将如何访问数据库本身,通过直接命名空间 App::bind 调用它?我不会使用 Eloquent,但我会使用 DB 类
  • 类名好像是\Illuminate\Support\Facades\DB
【解决方案2】:

使用静态方法的想法是错误的,通过对象是不可能的。

您应该为您的数据库操作创建存储库,然后您可以大量注入它们。

创建 Eloquent 存储库或 DB 存储库的方向:

在这里我找到了great article 来执行此操作。

【讨论】:

  • 抱歉,今天签到的回复晚了。我阅读了您链接的文章以及有关存储库的更多文章。我开了个玩笑。仍然有点困惑 Example- CarRepositoryInterface 文件将从控制器链接,并且 CarRepositoryInterface 文件与应用程序绑定到实际的 CarRepository 文件。我将把数据库注入到哪里,如何注入?另外,我需要模型类来操纵/播放我刚刚检索到的数据库数据,然后再将其送回控制器。数据库连接会保存在 CarRepository 文件中吗?我的 CarModel 类将如何将其注入其中?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-27
  • 1970-01-01
  • 2018-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-01
相关资源
最近更新 更多