Slim Callable UserController不存在RuntimeException

时间:2017-02-14 07:49:50

标签: php model-view-controller slim

嗨,我是新来的苗条我坚持这个任何人的帮助,请

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};
    }
}

3 个答案:

答案 0 :(得分:7)

您已将路线定义为:

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

然后您需要将DI工厂定义为:

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

您还应该查看命名空间和PSR-4如何将命名空间名称映射到目录。通常,命名空间名称中永远不会有src,但您确实会在composer.json中指定的Composer自动加载器中看到映射到目录调用App的{​​{1}}等命名空间。

通常,它看起来像这样:

src

这意味着您有一个名为"autoload": { "psr-4": { "App\\": "src/" } }, 的目录,该目录中的任何类都将具有src的基本命名空间,然后任何其他目录充当子命名空间。

即。如果您有一个名为App的文件,那么该文件中的类定义将是:

src/Controllers/UserController.php

另请注意,文件名的大小写与类名匹配,并且目录的大小写与子名称空间的大小写匹配。

继续这个例子,我希望DI工厂看起来像这样:

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

在命名空间定义中看到$container['UserController'] = function ($container) { return new \App\Controllers\UserController($container->get('settings')); }; 是非常不寻常的,因此请检查磁盘上的命名空间和文件是否都匹配,因为问题中的代码不一致。

答案 1 :(得分:0)

您可以检查包含控制器类的文件(controller.php)的名称。它们必须相同。

例如:

如果您具有 Contoller.php 文件,则必须使用此类 C ontroller之类的名称。

在您的示例中,您有 Controller.php 文件,其大写字母为 C 但是, c ontroller类不是以大写字母开头。

因此,请确保文件名类名相同。

希望这会对您有所帮助。

答案 2 :(得分:0)

就我而言,这是可行的,我也希望您能

home_controller.php

//@version=4
strategy(title="Strategy:Moving Average",overlay=true)
SMA = sma(close,30)
plot(SMA)

route.php *

namespace Apa\Kabar;

use Psr\Container\ContainerInterface;

class HomeController
{
   protected $container;

   // constructor receives container instance
   public function __construct(ContainerInterface $container) {
       $this->container = $container;
   }

   public function home($request, $response, $args) {
        // your code
        // to access items in the container... $this->container->get('');
        return $response->write('apa kabar');
   }

   public function contact($request, $response, $args) {
        // your code
        // to access items in the container... $this->container->get('');
        return $response;
   }
}