为什么在加载/启动时初始化所有Slim路由?

时间:2014-04-07 18:58:49

标签: php rest slim

好的,对我来说这个很奇怪。但我可能只是遗漏了一些东西。

我有一个使用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错误。将价格用户添加到数据库后,错误就会停止。

它已经在我在路由中指定的每个新数据库用户执行此操作 - 直到它实际添加到数据库中。

1 个答案:

答案 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中的代码意外执行。