Я работаю с таким компонентом маршрутизатора Symfony:
index.php
require '../application/core/Core.php';
$request = Request::createFromGlobals();
// Our framework is now handling itself the request
$app = new Framework\Core();
$response = $app->handle($request);
$response->send();
Core.php
namespace Framework;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\HttpKernelInterface;
use Symfony\Component\Routing\Matcher\UrlMatcher;
use Symfony\Component\Routing\RequestContext;
use Symfony\Component\Routing\RouteCollection;
use Symfony\Component\Routing\Route;
use Symfony\Component\Config\FileLocator;
use Symfony\Component\Routing\Loader\YamlFileLoader;
use Symfony\Component\Routing\Exception\ResourceNotFoundException;
class Core implements HttpKernelInterface
{
/** @var RouteCollection */
protected $routes;
public function __construct()
{
$this->routes = new RouteCollection();
}
public function handle(Request $request, $type = HttpKernelInterface::MASTER_REQUEST, $catch = true)
{
// Load routes from the yaml file
$fileLocator = new FileLocator(array(__DIR__));
$loader = new YamlFileLoader($fileLocator);
$routes = $loader->load('routes.yaml');
// create a context using the current request
$context = new RequestContext();
$context->fromRequest($request);
$matcher = new UrlMatcher($routes, $context);
try {
$attributes = $matcher->match($request->getPathInfo());
print_r($attributes);
$controller = $attributes['_controller'];
$response = call_user_func_array($controller, $attributes);
} catch (ResourceNotFoundException $e) {
$response = new Response('Not found!', Response::HTTP_NOT_FOUND);
}
return $response;
}
public function map($path, $controller) {
$this->routes->add($path, new Route(
$path,
array('controller' => $controller)
));
}
}
В routes.yaml
Я добавляю:
index:
path: /test/foo
methods: GET
controller: 'App\Catalog\Controller\Home\IndexController::index'
И у меня есть этот контроллер индекса:
namespace App\Catalog\Controller\Home;
class IndexController extends \App\Core\Controller
{
public function index()
{
$this->Language->load('common/home');
$data['url'] = Config::get('URL');
$data['title'] = $this->Language->get('text_title');
//$data['Csrf_Token'] = Csrf::generate('csrf_token');
$this->templates->addData($data, 'common/header');
$headerData['scripts'] = $this->Document->getScripts('header');
$headerData['data'] = $this->loadController('Common\HeaderController')->index();
$this->templates->addData($headerData, 'common/header');
echo $this->templates->render('index/index', $data);
}
}
Сейчас в действии, когда я загружаю этот URI: test/foo
в браузере, я вижу эту ошибку:
> Устаревшее: call_user_func_array () ожидает, что параметр 1 является допустимым обратным вызовом, нестатический метод App \ Catalog \ Controller \ Home \ IndexController :: index () не должен вызываться статически в / Applications / MAMP / htdocs / test /application / core / Core.php в строке 42
Неустранимая ошибка: Uncaught Ошибка: использование $ this, когда не в контексте объекта в / Applications / MAMP / htdocs / test / application / Catalog / Controller / Home / IndexController.php: 16 трассировки стека: # 0 [внутренняя функция]: App \ Catalog \ Controller \ Home \ IndexController :: index ('App \ Catalog \ Con ...', 'index') # 1 / Applications / MAMP / htdocs /test / application / core / Core.php (42): call_user_func_array ('App \ Catalog \ Con ...', Array) # 2 / Applications / MAMP / htdocs / test / public / index.php (98): Framework \ Core-> handle (Object (Symfony \ Component \ HttpFoundation \ Request)) # 3 {main}, брошенный в / Applications / MAMP / htdocs / test / application / Catalog / Controller / Home/IndexController.php в строке 16
Строка 42 в Core.php
Файл:
$response = call_user_func_array($controller, $attributes);
Как я могу исправить эту ошибку?!