代码之家  ›  专栏  ›  技术社区  ›  learningtech

在laravel中使用外部类时找不到类

  •  0
  • learningtech  · 技术社区  · 5 年前

    我正在努力以拉雷维尔的方式加入外部课程。我现在有一个迂回的方法来做这件事。。

    首先我有个文件 app/Http/Requests/Moneris/Moneris.php 包括以下内容:

    <?php
    namespace App\Http\Requests\Moneris;
    
    class mpgTransaction {
    /* stuff */
    }
    

    然后进来 app/Http/Controllers/MyController.php ,我有以下内容:

    <?php
    namespace App\Http\Controllers;
    
    require_once(str_replace("/MyController.php","/",__FILE__).'../Requests/Moneris/Moneris.php');
    use App\Http\Requests\Moneris as mn;
    
    class MyController extends Controller
    {
        public function index()
        {
            $mpg = new mn\mpgTransaction();
        }
    }
    

    这个很好用。但如果我改变了 MyController.php 致:

    <?php
    namespace App\Http\Controllers;
    
    use App\Http\Requests\Moneris\Moneris;
    
    class MyController extends Controller
    {
        public function index()
        {
            $mpg = new mpgTransaction();
        }
    }
    

    我发现一个500内部服务器错误,日志显示 mpgTransaction 找不到类。我做错了什么?

    1 回复  |  直到 5 年前
        1
  •  3
  •   Marcin Orlowski    5 年前

    追随 PSR-1 standard 你应该把你的班级命名为 Moneris 而不是 mpgTransaction 。此外,要使自动加载器工作,您必须具有匹配的文件名和类名。

    那么文件呢 Moneris.php 应该是。

    <?php
    namespace App\Http\Requests\Moneris;
    
    class Moneris {
    /* stuff */
    }
    

    在拉威尔,你不用 require_once() 使用 PSR-4 因此,当你遵循自动加载规则时,你应该删除它,我认为当你重命名这个类时,你会删除它。

    您的最终控制器版本可以是。

    use App\Http\Requests\Moneris\Moneris;
    
    public function index()
    {
        $mpg = new Moneris();
    }
    
        2
  •  3
  •   Md. Amirozzaman    5 年前

    有三种类型的 namespace

    1. 不合格的
    2. 有资格的
    3. 完全合格

    在第一种情况下,您包括该文件和 名称空间 qualified namespace -这就是为什么工作很好。但在第二个案例中,你违反了自动加载标准 PSR-4

    终止类名对应于以 .php 。文件名必须与终止类名的大小写匹配。

    如果你只给出类名,它会很好用 Moneris 而不是 mpgTransaction 在你的 Moneris.php 文件

    如何使用 use

    // Pre PHP 7 code
    use some\namespace\ClassA;
    use some\namespace\ClassB;
    use some\namespace\ClassC as C;
    
    use function some\namespace\fn_a;
    use function some\namespace\fn_b;
    use function some\namespace\fn_c;
    
    use const some\namespace\ConstA;
    use const some\namespace\ConstB;
    use const some\namespace\ConstC;
    
    // PHP 7+ code
    use some\namespace\{ClassA, ClassB, ClassC as C};
    use function some\namespace\{fn_a, fn_b, fn_c};
    use const some\namespace\{ConstA, ConstB, ConstC};
    

    笔记 :命名空间名称不区分大小写。

    重要环节

    namespaces basics