php - Slim Callable UserController 不存在 RuntimeException

标签 php model-view-controller slim

嗨,我是 slim 的新手,我一直坚持这个,请大家帮忙

routes.php

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

dependencis.php

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

用户 Controller .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};
    }
}

最佳答案

正如您将路线定义为:

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

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

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

您还应该查看 namespace 和 PSR-4 的 namespace 名称到目录的映射是如何工作的。一般来说,命名空间名称中永远不会有 src,但您确实会看到诸如 App 之类的命名空间映射到目录调用 src composer.json 中指定的 Composer 自动加载器。

通常,它看起来像这样:

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

这意味着您有一个名为 src 的目录,该目录中的任何类都将具有 App 的基本命名空间,然后任何其他目录都将作为子命名空间.

即如果您有一个名为 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 真的很不寻常,因此请检查并检查您的命名空间和磁盘上的文件是否全部匹配,因为问题中的代码不一致。

关于php - Slim Callable UserController 不存在 RuntimeException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42220561/

相关文章:

c# - .NET 3.5CF WebRequest 到 Slim Framework

cloud - 如何更改 cloudControl 上的 DocumentRoot?

php - 找不到 composer phpunit psr-4 自动加载类

php - 重复行输出 PHP - 连接的 fgets

php - 作业类不接受从 laravel 中的 Controller 发送的参数

ios - UIView 职责(面向对象编程)

javascript - Controller 作为语法问题

javascript - 为什么我不能将 SailsJS 模型命名为与 MySQL 表相同的名称?

php - 多个网络应用程序和数据库的架构

php - C - 编写自定义处理程序