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

问题描述 投票:-1回答:2

早上好

如何在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?

php oop slim slim-3
2个回答
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
投票

感谢新鲜的早晨精神,我自己想出来但我昨天真的坐了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'];
    }
© www.soinside.com 2019 - 2024. All rights reserved.