我正在尝试使最低的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访问这些函数并将结果返回到浏览器。在此过程中我缺少什么?
答案 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();