Минимальное использование маршрутизации Symfony - PullRequest
0 голосов
/ 21 марта 2019

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

Чтобы собрать его вместе, я создал новый файл композитора с именем 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 Symfony\Component\Config\FileLocator;
use Symfony\Component\Routing\Loader\YamlFileLoader;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;


$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 includeфайлы для этого нового способа, намного лучше, но я не получаю ничего возвращенного в браузер, когда я захожу на сайт: http://www.myserver.org/api/foo

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

$foo_route = new Route('/api/foo', array('App\Http\Controllers\Api\V2\LuckyController' => 'number') );

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

1 Ответ

1 голос
/ 21 марта 2019

У Дбруманна была намного лучшая связь, чем у меня.Я просматривал обычный раздел документации здесь: https://symfony.com/doc/current/routing.html вместо раздела Build Your Own Framework: 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 \NoahBuscher\Macaw\Macaw;

$loader = new Nette\Loaders\RobotLoader;

// 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', 'App\Http\Controllers\Api\V2\Controller@accounting');

Macaw::dispatch();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...