在控制器中使用自定义文件夹(类)

时间:2016-12-17 01:17:03

标签: laravel

我在目录app中创建了一个名为Services的新文件夹。所以服务目录是app/Services。我想在Controller app / Http / Controllers中使用名为Connection.php的服务文件,但是当我尝试这样做时,我得到以下错误:

  

Class App \ Services \ Connection不存在

我还尝试在我的composer.json中添加目录和文件,但这也没有修复它。

控制器:

namespace App\Services;
namespace App\Http\Controllers;


use App\Services\Connection;
use Illuminate\Http\Request;

class ExampleController extends Controller
{
    protected $conn;
    public function __construct(Connection $conn)
    {
        $this->conn = $conn;
    }

Composer.json

"autoload": {
        "classmap": [
            "database",
            "app/Services"
        ],

"autoload-dev": {
        "classmap": [
            "tests/TestCase.php",
            "app/Services/Connection.php"
        ]
    },

编辑17.12.2016:(问题尚未解决)

感谢所有坚持这个问题的人!我很吵,如果我提供的信息太少,那么我总结一些我尝试过的东西。

1 =>删除了secound名称空间App\Services

2 =>添加路线(或目录)到我的composer.json(如上所述)

3 =>已使用composer updated和作曲家dump-autoload

4 =>使用use App\Services\Connection(我在服务中连接类的路径,我想在App\Http\Controllers\ExampleController中的ExampleController中使用)

连接类:

class Connection
{
    //Some guzzle stuff
}

因此,ExampleController看起来与上面完全没有服务名称空间,我得到完全相同的错误。我做错了什么?

3 个答案:

答案 0 :(得分:3)

namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Contracts\Auth\Guard;
use App\Http\Controllers\Controller;
use App\Services\Connection;

class ExampleController extends Controller
{
  public function __construct(Guard $auth, Connection $conn)
  {
     $this->auth = $auth;
     $this->conn = $conn;
  }
}

请尝试使用此代码。

答案 1 :(得分:1)

错误在您的命名空间声明中。你正在为同一个类声明两个名称空间!

namespace App\Services;
namespace App\Http\Controllers;

将使用最后一个。

删除App\Http\Controllers命名空间行。

还记得你应该导入基本控制器:

use App\Controllers\Controller;

为什么?

当您尝试使用App\Services\ExampleController时,composer将在自动加载路径中查找该类,但由于您的命名空间不同,因此无法加载它。

答案 2 :(得分:1)

提出此解决方案作为评论,但为了让未来的观众更容易:

解决方法是确保所有正在引用的文件中包含正确的名称间距,包括控制器和类。如果命名空间不正确,则无法访问它。

在这种情况下,您必须确保Connection类的名称空间使用App\Services作为名称空间,并且控制器在App\Services\Connection的同一名称空间中访问它。