早上好
如何在Slim Api的Model函数中的dependencies.php中的$ container中使用__construct中的$ settings $ logger和$ db?
我的Slim框架Api有以下设置:
settings.php(在$ container中有$ settings $ looger和$ db)
/双人床/models/data model.PHP
namespace Namespace\Api\Models\v1;
class DataModel
{
private $settings;
private $logger;
private $db;
function __construct($settings, $logger, $db) {
$this->settings = $settings;
$this->logger = $logger;
$this->db = $db;
}
function get() {
****
}
}
routes.php文件
use Slim\Http\Request;
use Slim\Http\Response;
$app->group('/v1', function () use ($app) {
$app->GET('/imprint/[{id}]', 'Namespace\Api\Models\v1\DataModel:get');
});
我得到的错误信息是:
Too few arguments to function eRecht24\Api\Models\v1\ImprintModel::__construct()
如果我理解正确,我需要像这样实例化模型,以便传递$ settings $ logger和$ db:
$model = new Namespace\Api\Models\v1\DataModel($container->settings, $container->logger, $container->db);
据我所知,他们($ container-> settings等)并没有解决。这个实例化是否正确?我在哪里放置它以便能够在我的模型函数中使用$ settings $ logger和$ db?
如果您希望能够将容器以外的参数传递给构造函数,则需要在依赖容器中注册其工厂。
当在依赖容器中找不到类时,Slim尝试创建它并为您传递容器实例。这就是为什么你的答案中的ImprintModel
正在运作。
如果要使用带参数的构造函数
namespace Namespace\Api\Models\v1;
class DataModel
{
public function __construct($settings, $logger, $db)
{
...
}
}
在您的依赖注册中,您需要添加
$container[\Namespace\Api\Models\v1\DataModel::class] = function ($c) {
$settings = $c['settings'];
$logger = $c['logger'];
$db = $c['db'];
return new \Namespace\Api\Models\v1\DataModel($settings, $logger, $db);
}
感谢新鲜的早晨精神,我自己想出来但我昨天真的坐了2个小时...... :(
数据模型必须如下所示:
class ImprintModel
{
protected $c;
private $settings;
private $logger;
private $db;
function __construct($container) {
$this->c = $container;
$this->settings = $container['settings'];
$this->logger = $container['logger'];
$this->db = $container['db'];
}