最小Symfony路由使用情况

时间:2019-03-21 04:40:44

标签: php laravel symfony routes

我正在尝试使最低的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文件以这种新方式,效果更好,但是当我访问该网站时,我什么也没有返回浏览器:{ {1}}

我尝试了其他几种方法,例如:

http://www.myserver.org/api/foo

我似乎没有做任何事情来让Symfony访问这些函数并将结果返回到浏览器。在此过程中我缺少什么?

1 个答案:

答案 0 :(得分: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 \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();