Минимальное использование маршрутизации Symfony

#php #laravel #symfony #routes

#php #laravel #symfony #маршруты

Вопрос:

Я пытаюсь собрать минимальную систему маршрутизации Symfony для запуска на стороне моей установки Laravel, чтобы входящие API были вне полной установки Laravel. Я заметил, что наша обычная система Laravel включает в себя 575 файлов для рендеринга / загрузки, и она просто слишком медленная, чтобы обрабатывать входящую рабочую нагрузку. Более подробная информация здесь: https://serverfault.com/questions/959018/apache-tuning-for-512gb-ram

Чтобы собрать это воедино, я создал новый файл composer с именем minvendor.json и следующим:

 {
    "config": {
        "vendor-dir": "minvendor"
    },
    "require": {
        "symfony/routing": "^4.2",
        "symfony/http-foundation": "^4.2",
        "symfony/yaml": "^4.2",
        "symfony/config": "^4.2"
    }
}
  

Поскольку composer.json файл уже существует, вам придется использовать другую команду для загрузки minvendor.json файла.

 env COMPOSER=minvendor.json composer install
  

Затем я поместил следующее в .htaccess файл:

 RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^api api.php [L]
  

После этого я создал api.php файл со следующим

 <?PHP
require __DIR__.'/../minvendor/autoload.php';
use SymfonyComponentConfigFileLocator;
use SymfonyComponentRoutingLoaderYamlFileLoader;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentRoutingAnnotationRoute;


$fileLocator = new FileLocator([__DIR__]);
$loader = new YamlFileLoader($fileLocator);
$routes = $loader->load('routes.yaml');

class LuckyController
{
    public function number()
    {
        $number = random_int(0, 100);

        return new Response(
            '<html><body>Lucky number: '.$number.'</body></html>'
        );
    }
}
  

и в routes.yaml файле:

 route1:
    path:       api/foo
    controller: LuckyController::number
    methods:    GET|POST
  

Используя функцию php print_r(get_included_files()) я вижу, что использую только 20 включенных файлов для этого нового способа, так намного лучше, но я ничего не получаю обратно в браузер, когда захожу на сайт: http://www.myserver.org/api/foo

Я попробовал пару других способов, таких как:

 $foo_route = new Route('/api/foo', array('AppHttpControllersApiV2LuckyController' => 'number') );
  

Кажется, что я ничего не делаю, чтобы заставить Symfony получить доступ к функциям и вернуть результаты в браузер. Чего мне не хватает в процессе?

Комментарии:

1. Есть какие-либо ошибки или журналы доступа?

2. В этом подходе есть немало пробелов, которые необходимо заполнить, что затрудняет полный ответ. Пожалуйста, ознакомьтесь с серией блогов «Создайте свой собственный фреймворк», особенно с разделом маршрутизации в Symfony docs. Это даст вам рабочий пример, на котором вы можете основать свой подход.

Ответ №1:

У Dbrumann была намного лучшая ссылка, чем у меня. Я просматривал обычный раздел документации здесь: https://symfony.com/doc/current/routing.html вместо раздела «Создайте свой собственный фреймворк»: https://symfony.com/doc/current/create_framework/routing.html

Прежде чем я получил его ответ, я попробовал другую библиотеку маршрутизации Macaw (https://github.com/noahbuscher/macaw ) который в итоге оказался довольно простым и использовал гораздо меньше включенных файлов.

В дополнение к маршрутизации мне понадобился автозагрузчик, поскольку файлы контроллера находились за пределами общего каталога, который я выбрал robot-loader , так что теперь мой minvendor.json файл выглядит следующим образом:

 {    
    "config": {
        "vendor-dir": "minvendor"
    },
    "require": {
        "noahbuscher/macaw": "dev-master",
        "nette/robot-loader": "dev-master"
    }
}
  

и страница с полным рабочим примером будет выглядеть следующим образом:

 <?PHP
require __DIR__.'/../minvendor/autoload.php';
use NoahBuscherMacawMacaw;

$loader = new NetteLoadersRobotLoader;

// Add directories for RobotLoader to index
$loader->addDirectory(__DIR__ . '/../app/Http/Controllers/Api/V2');

// And set caching to the 'temp' directory
$loader->setTempDirectory(__DIR__ . '/temp');
$loader->register(); // Run the RobotLoader


//just a couple ways you can define routes
Macaw::get('/api/foo', function() {
  echo 'Hello world!';
});
Macaw::post('/api/bar', 'AppHttpControllersApiV2Controller@accounting');

Macaw::dispatch();