反射异常:类ClassName不存在

时间:2017-11-09 09:21:06

标签: php laravel namespaces

我正在使用Laravel 5.5。我在我的工作区中的App文件夹中添加了自定义目录。所以,文件夹结构是:

Inside App \ Bishwa \ Transformers有两个php文件:

  1. Transformer.php
  2. LessonTransformer.php
  3. 这些文件如下所示:

    1. Transformer.php

      <?php
      
      namespace Bishwa;
      
      abstract class Transformer {
      
          public function transformCollection(array $items){
      
              return array_map([$this, 'transform'], $items);
      
          }
      
          public abstract function transform($item);
      }
      
    2. LessonTransformer.php

      <?php
      
      namespace Bishwa;
      
      class LessonTransformer extends Transformer {
      
      
      
          public function transform($lesson){
      
              return [
                  'title' => $lesson['title'],
                  'body' => $lesson['body'],
                  'active' => (boolean)$lesson['some_bool']
              ];
      }
      
      }
      
    3. 然后在LessonsController.php里面我有以下内容:

      <?php
      
      namespace App\Http\Controllers;
      
      use Illuminate\Http\Request;
      use Illuminate\Support\Facades\Response;
      use App\Lesson;
      use Bishwa\LessonTransformer;
      
      class LessonsController extends Controller
      {
          protected $lessonTransformer;
      
          function __construct(LessonTransformer $lessonTransformer){
              dd('ok');
      
      }
      

      在运行控制器的操作时,它给了我一条错误消息:

      Reflection Exception : Class Bishwa\LessonTransformer does not exist
      

      我已经尝试composer dump-autoload,重新启动服务器,但没有一个帮助。我在Namespacing或者什么??

      时做错了

2 个答案:

答案 0 :(得分:-1)

将自定义目录中文件的命名空间更改为App\Bishwa

答案 1 :(得分:-1)

非常感谢杰罗德夫和杰克。既然他们都写了,我决定自己写一个解决这个问题的综合解决方案。

第一个解决方案:

如果是自定义命名空间和自定义类,我必须在Composer.json文件中包含以下部分中classname的路径:

"autoload": {
        "classmap": [
            "database/seeds",
            "database/factories",
             "app/Bishwa/Transformers"


        ],
        "psr-4": {
            "App\\": "app/"
        }

第二个解决方案:

将文件的NameSpace更改为自定义目录App\Bishwa

transformer.php和LessonTransformer.php的命名空间现在变为:

namespace App\Bishwa\Transformers;

在LessonsController中使用时:

use App\Bishwa\Transformers\LessonTransformer;

再一次,非常感谢杰罗德夫和杰克。这是我的愚蠢错误,我无法解决这个问题。