2015-11-02 159 views
0

我正在尝试自动加载我的类。我用一个文件Foo.php和一个Bar.php文件创建一个文件夹app/Classes。Laravel 5麻烦自动加载类 - 未找到类错误

在composer.json我的文件夹中

composer dump-autoload 

已验证vandor /自动加载/ autoload_classmap.php引用

"autoload": { 
    "classmap": [ 
     "database", 
     "app/Classes/" 
    ], 
    "psr-4": { 
     "App\\": "app/" 
    }, 
    "files": ["app/Library/myFunctions.php"] 
}, 

关注这个既有

'Bar' => $baseDir . '/app/Classes/Bar.php', 
'Foo' => $baseDir . '/app/Classes/Foo.php', 

我把在每个类中的简单功能,如:

<?php 
    class Bar { 
     public function __construct(){ 
      echo 'Bar'; 
     } 
    } 
?> 

然后我试图引用它

new Bar; 

,并收到错误

FatalErrorException in LoginController.php line 24: 
Class 'App\Http\Controllers\Login\Bar' not found 

NOW .....解决我把错误

new \Bar; 

和我们很好。

是否有某些原因我需要我的代码中的'\'。这种修复方式无处可寻,我只是在laracasts上注意到它,并在挫折中添加它,并且它很有效。

回答

0

这是一个命名空间问题。它看起来像设置"app/Classes/",因为类映射将类中的类设置为根名称空间中的类。所以Foo和Bar都在根。您的控制器似乎在此名称空间中:App\Http\Controllers\Login。除非另有特定的类名称与当前命名空间相关,因此只需使用Foo就可以查找类App\Http\Controllers\Login\Foo。在前面放置斜杠就可以阻止它相对并直接进入根目录(可以考虑文件夹或URL) 。

如果你想要它更整洁,你可以把use Foo;放在顶部,在命名空间的下面,如果有的话,但在其他之前。

+0

看起来像我可以添加使用App \ Classes \酒吧在顶部然后做新酒吧;或者我可以跳过它并执行新的\ App \ Classes \ Bar;但我认为重点是我正在从一个更深的文件夹测试这个,我所关注的大多数例子都在根文件夹中。 – Iannazzi

+0

然而,只是把'使用Foo'放入工作不起作用。 – Iannazzi

+0

嗯,这很奇怪 - \ Bar工作,但名称空间实际上是\ App \ Classses \ Bar。我知道Laravel的确在类名方面做了一些鬼鬼祟祟的技巧,但这看起来很奇怪。 – Octo