Slim Api在Model函数中从dependencies.php使用__construct中的$ settings $ logger和$ db

时间:2019-03-01 08:32:02

标签: php oop slim slim-3

早上好

我如何在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,我应该将其放在哪里?

2 个答案:

答案 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'];
    }