Slim Api Использование $ settings $ logger и $ db в __construct из dependencies.php в функции Model - PullRequest
0 голосов
/ 01 марта 2019

Доброе утро

Как я могу использовать $ settings $ logger и $ db в __construct из контейнера $ в dependencies.php в функции Model в Slim Api?

У меня естьследующие настройки для моего Slim Framework Api:

settings.php (содержит $ 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() {
         ****
    }
}

rout.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 в моих функциях Model?

Ответы [ 2 ]

0 голосов
/ 04 марта 2019

Если вы хотите передать конструктору параметр, отличный от контейнера, вам необходимо зарегистрировать его фабрику в контейнере зависимостей.

Когда класс не может быть найден внутри контейнера зависимостей, 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);
}
0 голосов
/ 01 марта 2019

Благодаря свежему утреннему духу я понял это сам, но вчера я действительно сидел на этом 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'];
    }
...