【问题标题】:Get rid of use Illuminate\Support\Facades\DB statement in repository classes摆脱存储库类中的 use Illuminate\Support\Facades\DB 语句
【发布时间】:2019-12-29 16:55:11
【问题描述】:

我将 lumen 中的存储库模式与 Query Builder 一起使用。存储库类通常如下所示:

<?php
namespace App\Repositories;

use Illuminate\Support\Facades\DB;

class RepoNameRepository {
    public function methodName() {
        /* 
        Various Calls to the DB facade...
        $data = DB::table("tableName")...->get(); 
        */
        return $data;
    }   
}

有什么有效的方法摆脱 use语句 use Illuminate\Support\Facades\DB在每个开头我的存储库类?理想情况下,DB 门面将在 web.php 中可用。

到目前为止,我能想到的是拥有一个带有 use 语句的 Repository 基类。

【问题讨论】:

    标签: php laravel repository-pattern lumen


    【解决方案1】:

    不,这就是 PHP 的工作原理。

    您的替代方法是使用别名:

    use DB;
    

    或者在你的调用前加上一个反斜杠,这样它就会在根命名空间中查找。

    \DB::table('users');
    

    【讨论】:

    • DB 别名在哪里定义?
    • 大部分(如果不是全部)Facades 别名在config/app.php 下的aliases 中定义,您甚至可以添加自己的别名。
    【解决方案2】:

    您可以将app() 辅助函数与'db' service container binding key 一起使用:

    $data = app('db')->table('tableName')...->get();
    

    它不需要任何use 语句。

    【讨论】:

    • 如果 app() 在存储库类中全局可用,是否真的没有办法为 DB::table() 实现相同的目标? :)
    • app() 是一个函数,DB 是一个类。不合格的函数解析为全局函数,不合格的类解析为当前命名空间,请参阅here,因此您必须使用\DB::table(),正如@Dwight 正确解释的那样。如果您使用 DB::table() 而不使用 use php 在当前命名空间中搜索。
    猜你喜欢
    • 2015-01-14
    • 2021-01-08
    • 2019-12-30
    • 2017-03-08
    • 2020-01-24
    • 2020-12-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多