2014-04-07 28 views
2

好的,对我来说这个很奇怪。但我可能只是错过了一些东西。为什么所有Slim路线都在加载/启动时初始化?

我有一个使用Slim约20条路由的REST API。每条路由都会通过传递给构造的db配置加载一个MySQL类。但是,任何时候我添加一个新的数据库连接配置(我还没有在数据库中设置)的路线,它会抛出一个“坏数据库配置”异常,即使我不是调用新的/未完成的路线。

因此,每当我进行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用户 - 直到它实际添加到db。

+2

还没有使用苗条,所以我不能在那里发表评论。但是可能需要在可以在需要时调用的单独类中初始化数据库连接(如果它已经存在,将不会被重新创建)。 – Sam

+0

听起来很古怪。你能否提供一个代码示例,显示你的几条路线? –

+0

@JeremyKendall:添加了代码示例 – Ahhk

回答

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将被执行。

建议书

如果这是我的应用程序,我会考虑用修身的resource locator配置您的数据库连接。

$app->dbConfig = $dbconfig; 
$app->docsDb = function() use ($app) { 
    return new MySQL($app->dbconfig['docs']); 
}; 

然后,适当的路线中,你可以使用像这样的连接(假设你有你的MySQLfindAll()法):

$app->get('/example', function() use ($app) { 
    $allDocs = $app->docsDb->findAll(); 
}); 

有到无数的好处,而不是其中至少有一点是避免在index.php中出现意外执行的代码。

+0

哇。好。你让我的头受伤了。呵呵。至于PHP执行,我只是假设组/路由基本上像函数/方法一样行事,因此除非调用“函数”,否则内部任何内容都不会执行。我想我错了。谢谢!至于资源位置,我很困惑。我需要基于每个路由组指定dbconfig(它只是一个MD数组,其中连接字符串通过键分配)。 – Ahhk

+0

而且,我在其他类中使用了MySQL类($ db)的实例,通过将$ db传递给构造函数实际完成该工作,如下所示:function __construct($ db){ \t \t $ this-> dbclass = $ D b; }没有$ db调用实际上是通过“索引”进行的。所以我不明白这是如何工作的。我做错了什么吗? :0 – Ahhk

+0

我猜我可以将$ app-> docsDB传递给其他类的构造函数,但仍然不知道如何在组中使用您的示例分配数据库配置。你是说我应该在所有组/路由之前为每个db配置设置一个“新的MySQL”函数,然后在组/函数中调用我需要的任何函数?对不起,如果我很慢。 – Ahhk

相关问题