早上好
我如何在Slim Api的Model函数中的Dependencies.php中的$ container中的__construct中使用$ settings $ logger和$ db?
我为Slim框架Api进行了以下设置:
settings.php(在$ container中具有$ settings $ looger和$ db)
/src/Models/DataModel.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,我应该将其放在哪里?
答案 0 :(得分:0)
如果您希望将容器以外的参数传递给构造函数,则需要在依赖容器中注册其工厂。
当在依赖关系容器中找不到类时,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);
}
答案 1 :(得分:-1)
多亏了早晨的精神,我自己弄清楚了,但昨天我真的坐在那里两个小时了...:(
DataModel必须看起来像这样:
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'];
}