Ошибка в роутинге

125
08 июля 2021, 09:40

Хотел сделать роутинг на чистом php, но потом меня черт дернул установить symfony/router и теперь я чувствую себя идиотои. У меня проблема с подключением классов, делал по инструкции и получил:

Fatal error: Uncaught Error: Class 'AppController' not found in /home/vagrant/html/phb/vendor/symfony/http-kernel/Controller/ControllerResolver.php on line 151

Вот что впилил:

<?php
require_once __DIR__.'/../vendor/autoload.php';
use Symfony\Component\Dotenv\Dotenv;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\RouteCollection;
use Symfony\Component\Routing\RequestContext;
use Symfony\Component\Routing\Matcher\UrlMatcher;
use Symfony\Component\Routing\Route;
use Symfony\Component\Routing\Exception\ResourceNotFoundException;
use Symfony\Component\HttpKernel;
use App\Http\Controller\AppController;
$dotenv = new Dotenv();
$dotenv->load(__DIR__.'/../.env');
$request = Request::createFromGlobals();
$routes = new RouteCollection();
$routes->add('main', new Route('/',
        array(
            '_controller' => 'AppController::index',
        )
    )
);

$context = new RequestContext();
$context->fromRequest($request);
$matcher = new UrlMatcher($routes, $context);
$resolver = new HttpKernel\Controller\ControllerResolver();
try {
    $request->attributes->add($matcher->match($request->getPathInfo()));
    $controller = $resolver->getController($request);
    $arguments = $resolver->getArguments($request, $controller);
    $response = call_user_func_array($controller, $arguments);
} catch (ResourceNotFoundException $e) {
    $response = new Response('Not found', 404);
} catch (Exception $e) {
    $response = new Response('Error occurred', 500);
}
$response->send();

Где глупость я сделал?

Answer 1

Попробуйте сделать так:

$routes->add('main', new Route('/',
        array(
            '_controller' => 'App\Http\Controller\AppController::index',
        )
    )
);

Почему так? Потому что вы передаете строкой в объект Route, а там будет подключаться класс AppController, и там нет объявленного use App\Http\Controller\AppController.

Так же с php 5.3.0 вы можете сделать вот так, правда у вас action index вряд ли отработает(зависит от класса Route):

$routes->add('main', new Route('/',
        array(
            '_controller' => AppController::class,
        )
    )
);

Вообщем вся фича в том, что вы передаете полный namespace, т.к. класс там будет вызываться анонимно. А константа AppController::class возвращает полное имя класса, т.е. если вы пропишите сейчас в вашем файле:

echo AppController::class;  // output: 'App\Http\Controller\AppController'

Что у вас написано в файле:

use App\Http\Controller\AppController;

И что написано в AppController:

namespace App\Http\Controllers;

Обратите внимание на слово Controller(s), вы определитесь, ставить вам букву или нет )

Еще замечание, у вас в composer.json прописано:

"autoload": {
    "psr-4": {
        "App\\": "app"
    }
}

А надо:

"autoload": {
    "psr-4": {
        "App\\": "app/"
    }
}
READ ALSO
Мулти Файл аплоадер, ошибка

Мулти Файл аплоадер, ошибка

Имеется такой код

102
При использовании $_FILES ошибка с значениями

При использовании $_FILES ошибка с значениями

Не работает функция move_uploaded_file, скорее всего проблема в синтаксисе, можете подсказать, почему код так не работает?

110
laravel-image-optimizer InvalidArgumentException

laravel-image-optimizer InvalidArgumentException

при установке пакета

95
Autoload Composer

Autoload Composer

При переносе проекта с локального компьютера на сервер не работает автозагрузка класса RoutingОшибка :Fatal error: Uncaught Error: Class 'routing\Routing' not found Структура...

98