Хотел сделать роутинг на чистом 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();
Где глупость я сделал?
Попробуйте сделать так:
$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/"
}
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Не работает функция move_uploaded_file, скорее всего проблема в синтаксисе, можете подсказать, почему код так не работает?
При переносе проекта с локального компьютера на сервер не работает автозагрузка класса RoutingОшибка :Fatal error: Uncaught Error: Class 'routing\Routing' not found Структура...