composer psr-4 автозагрузка классов, Class 'TestApp\Converter' not found
Хотел реализовать автозагрузку классов, но

Структура каталогов:
api
--index.php
--converter.php
vendor
composer.json
composer.json
{
"require": {
"php": "^7.3",
"slim/slim": "3.*",
},
"autoload": {
"psr4": {
"TestApp\\": "api/"
}
}
}
index.php
<?php
namespace TestApp;
use \Psr\Http\Message\ServerRequestInterface as Request;
use \Psr\Http\Message\ResponseInterface as Response;
use Respect\Validation\Validator as v;
include __DIR__.'/../vendor/autoload.php';
$config['displayErrorDetails'] = true;
$app = new \Slim\App(["settings" => $config]);
$app->get('/{id_page}', function (Request $request, Response $response, array $args) {
if(!$request->getAttribute('has_errors')){
$response->getBody()->write(Converter::getJsonByFileName(2));
}
else{
$response->getBody()->write($request->getAttribute('errors'));
}
return $response;
});
$app->run();
converter.php
<?php
namespace TestApp;
class Converter{
static function getFileName($filename){
return $filename;
}
}
?>
Любые попытки поиграть с пространствами имен успеха не приносят
Ответы (2 шт):
Замените psr4 на psr-4 и не забудьте выполнить php composer.phar update
{
"require": {
"php": "^7.3",
"slim/slim": "3.*",
},
"autoload": {
"psr-4": {
"TestApp\\": "api/"
}
}
}
В index.php namespace указывать не нужно.
Для неймспейса лучше выделить отдельную директорию (и, желательно, на уровень выше докрута),
Структура каталогов примерно такая:
public <- Вот это должно быть докрутом для apache/nginx/etc
index.php
src
Converter.php <- Соблюдаем регистр, т.к. сервер скорее всего будет на Linux и там регистр важен
vendor
composer.json
В composer.json указывавем (как уже заметили, меняем psr4 на psr-4):
{
"require": {
"php": "^7.3",
"slim/slim": "3.*",
},
"autoload": {
"psr-4": {
"TestApp\\": "src/"
}
}
}
В итоге public/index.php будет выглядеть так:
<?php
use \Psr\Http\Message\ServerRequestInterface as Request;
use \Psr\Http\Message\ResponseInterface as Response;
use Respect\Validation\Validator as v;
include __DIR__.'/../vendor/autoload.php';
$config['displayErrorDetails'] = true;
$app = new \Slim\App(["settings" => $config]);
$app->get('/api/{id_page}', function (Request $request, Response $response, array $args) {
if(!$request->getAttribute('has_errors')){
$response->getBody()->write(Converter::getJsonByFileName(2));
}
else{
$response->getBody()->write($request->getAttribute('errors'));
}
return $response;
});
$app->run();
и src/Converter.php:
<?php
namespace TestApp;
class Converter
{
static function getFileName($filename)
{
return $filename;
}
}
Стоит заметить, что закрывающий тег php ?> в конце файлов классов - плохая практика
Ну и напоследок - новые приложения всё же лучше писать на 4 версии slim)