好的,对我来说这个很奇怪。但我可能只是遗漏了一些东西。
我有一个使用Slim的REST API,大约有20条路由。每个路由加载一个MySQL类,并将db配置传递给构造。
但是,每当我添加一个新的数据库连接配置的新路由时(我还没有在数据库中设置),它会抛出一个错误的数据库配置"即使我没有呼叫新的/未完成的路线,也是例外。
因此,每当我进行API调用时,似乎每个ROUTE中的MySQL类都会被实例化。
嗯..?
每个请求的代码示例:
$app->group('/content/get', function () use ($app) {
require('config/mysql.settings.php');
$db = new MySQL($dbconfig['pages']);
$app->get('/:site/:page', function ($site, $page) use ($app, $db) {
...
});
});
$app->group('/library/get', function () use ($app) {
require('config/mysql.settings.php');
$db = new MySQL($dbconfig['docs']);
$app->get('/:doc', function ($doc) use ($app, $db) {
...
});
});
$app->group('/price/get', function () use ($app) {
require('config/mysql.settings.php');
$db = new MySQL($dbconfig['price']);
$app->get('/:doc', function ($doc) use ($app, $db) {
...
});
});
如果用户为"价格"配置还没有添加到db,我调用/ library / get,我得到一个db错误。将价格用户添加到数据库后,错误就会停止。
它已经在我在路由中指定的每个新数据库用户执行此操作 - 直到它实际添加到数据库中。
答案 0 :(得分:4)
这是一个PHP的东西,而不是一个苗条的东西。我们都知道PHP脚本从上到下执行,根据它发现的任何内容进行操作并进行评估。虽然在路由匹配之前不会执行Slim路由中的代码,但MySQL类实例化是在路由组定义中发生的,不是在路由中。
这个例子基于Slim Skeleton,是我努力验证我的想法。
<?php
require '../vendor/autoload.php';
// Prepare app
$app = new \Slim\Slim();
var_dump('app');
// Define routes
$app->get('/', function () use ($app) {
echo "/";
});
$app->group('/v1', function () use ($app) {
var_dump('/v1/var_dump');
$app->get('/home', function () use ($app) {
echo "/v1/home";
});
});
$app->group('/v2', function () use ($app) {
var_dump('/v2/var_dump');
$app->get('/home', function () use ($app) {
echo "/v2/home";
});
});
// Run app
$app->run();
无论您点击哪条路线,都会在执行路线代码之前执行对var_dump
的所有三次调用。
如果这是我的应用,我会考虑使用Slim的resource locator来配置您的数据库连接。
$app->dbConfig = $dbconfig;
$app->docsDb = function () use ($app) {
return new MySQL($app->dbconfig['docs']);
};
然后,在适当的路线中,你可以使用这样的连接(假设你的findAll()
类有MySQL
方法):
$app->get('/example', function () use ($app) {
$allDocs = $app->docsDb->findAll();
});
这有很多好处,其中最重要的是避免让index.php
中的代码意外执行。