修身赎回UserController中不存在的RuntimeException

问题描述:

嗨,我是新来的苗条我停留在这个任何人的帮助,请修身赎回UserController中不存在的RuntimeException

routes.php文件

$app->get('/', 'UserController:index'); 

dependencis.php

$container['src\UserController'] = function ($container) { 
    return new \src\UserController($container->get('settings')); 
}; 

UserController.php

namespace App\Controllers; 

use Psr\Http\Message\ServerRequestInterface as Request; 
use Psr\Http\Message\ResponseInterface as Response; 
use App\src\Controller; 
class UserController extends Controller { 
    public function index(Request $request, Response $response) { 
     return $this->db; 
    } 
} 

Controller.php这样

namespace App\src; 

class Controller { 
    protected $container; 
    public function __construct($c) { 
     $this->container = $c; 
    } 

    public function __get($property) { 
     if($this->container->has($property)) { 
      return $this->container->get($property); 
     } 
     return $this->{$property}; 
    } 
} 
+0

您确定应该在容器中返回'new \ src \ UserController()',而不是'new \ App \ src \ UserController'吗? –

+0

$ container ['src \ UserController'] = function($ container){ return new \ src \ UserController(); }; 这里通过改变路径\ src \ UserController()来更新它的大部分内容。和 return new \ src \ UserController($ contianer); –

+0

嗨@ShahzadNasir,我有一个看起来像你的问题。我可以从这里获得帮助:http://*.com/questions/43449493/slim-framework-routing-http-requests-to-static-class-methods。谢谢 – red

正如你所定义您的路线:

$app->get('/', 'UserController:index'); 

然后,你需要定义DI厂为:

$container['UserController'] = function ($container) { 
    // return an instantiated UserController here. 
}; 

您还应该查看名称空间和PSR-4的命名空间名称映射目录工作。一般而言,名称空间名称中永远不会有src,但您可以在composer.json中指定的名称空间(例如App)映射到Composer自动加载器中调用src的目录。

通常情况下,它看起来是这样的:

"autoload": { 
    "psr-4": { 
     "App\\": "src/" 
    } 
}, 

这意味着你有一个名为src和目录中的任何类目录,将有App基地命名空间,那么任何其他目录充当子-namespaces。

也就是说,如果你有一个名为src/Controllers/UserController.php文件,那么该文件中的类定义为:

<?php 
namespace App\Controllers; 
class UserController 
{ 
    // methods here 
} 

还要注意的是,文件名的大小写相匹配的类名和目录匹配的资本子命名空间的大小写。

要继续这个例子,我预计DI工厂看起来像这样:

$container['UserController'] = function ($container) { 
    return new \App\Controllers\UserController($container->get('settings')); 
}; 

这真是不同寻常看到src命名空间中的定义,因此经过,并检查您的命名空间和磁盘上的文件所有匹配,因为问题中的代码不一致。

+0

感谢@Rob Allen的工作 –