【发布时间】:2019-01-11 16:01:59
【问题描述】:
我正在为一个新应用程序使用 Slim Framework,我希望在我的 src 文件夹中有一个控制器目录。我不断收到错误消息:
Callable \App\Controllers\MobileApiController does not exist
dependencies.php
$container['MobileApiController'] = function ($c)
{
return new \App\Controllers\MobileApiController;
};
routes.php
$app->get('/user', '\App\Controllers\MobileApiController:getUser');
MobileApiController.php
<?php
namespace App\Controllers;
use Psr\Http\Message\ServerRequestInterface as Request;
use Psr\Http\Message\ResponseInterface as Response;
class MobileApiController
{
protected $container;
public function __construct($c) {
$this->container = $c;
}
public function getUser($request, $response, $args)
{
var_dump($request);
}
}
composer.json
"autoload-dev": {
"psr-4": {
"App\\": "src/",
"Tests\\": "tests/"
}
},
“src”文件夹有一个“Controllers”文件夹以及“routes.php”和“dependencies.php”文件
【问题讨论】:
-
你运行
composer dump-autoload了吗?我无法重现该错误。它对我有用。 -
只需在 composer.json 中将 App namespace
"App\\": "src/",从"autoload-dev"移动到"autoload"并运行composer update。 -
@DanielO 有什么理由使用
autoload而不是autoload-dev?因为 OP 可能真的希望有一些不需要包含在生产环境中的与开发相关的类。 -
@Nima 通常命名空间
Tests(或测试)仅与开发相关,App与生产和开发相关。Tests命名空间属于autoload-dev,App属于autoload。 -
是的,但是在这种情况下使用
autoload-dev应该不会导致任何问题,除非 OP 将--no-dev传递给作曲家。关键是我用autoload-dev检查了问题中描述的条件,我无法重现问题,所以问题应该是别的。