Устарело: call_user_func_array () не должен вызываться статически в компоненте Symfony Router. - PullRequest
1 голос
/ 09 июня 2019

Я работаю с таким компонентом маршрутизатора 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);

Как я могу исправить эту ошибку?!

1 Ответ

1 голос
/ 09 июня 2019

Исправлено:

    $controllerResolver = new HttpKernel\Controller\ControllerResolver();
    $argumentResolver = new HttpKernel\Controller\ArgumentResolver();

    try {
        $request->attributes->add($matcher->match($request->getPathInfo()));

        $controller = $controllerResolver->getController($request);
        $arguments = $argumentResolver->getArguments($request, $controller);

        $response = call_user_func_array($controller, $arguments);

        } catch (ResourceNotFoundException $e) {
        $response = new Response('Not found!', Response::HTTP_NOT_FOUND);
     }
...