#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();