Slim 4: используйте контейнер для обмена данными с БД с моделями и контроллерами без Eloquent - PullRequest
0 голосов
/ 14 февраля 2020

Я запускаю проект PET с SLIM 4 и не могу найти способ использовать соединение с базой данных в модели. Даже контроллер работает нормально.

Я использовал контейнер, чтобы иметь возможность перемещать соединение между различными слоями.

app. php

<?php
use Slim\Factory\AppFactory;

require __DIR__ . '/../../vendor/autoload.php';

//set container
$aux_container = new \DI\Container();
AppFactory::setContainer($aux_container);

$app = AppFactory::create();

//get container to manage dependencies on the rest of app files
$container = $app->getContainer(); 
require __DIR__ . '/../App/routes.php';
require __DIR__ . '/../App/configs.php';
require __DIR__ . '/../App/dependencies.php';

$app->run();

конфигурации. php

<?php

$container->set('db_settings',function(){
    return (object)[
        "DB_NAME" => "prohip_operations",
        "DB_USER" => "root",
        "DB_PASS" => "root",
        "DB_CHAR" => "utf8mb4",
        "DB_HOST" => "localhost",
        "DB_PORT" => "33066",
    ];
});

зависимости. php

<?php

use Psr\Container\ContainerInterface;

$container->set('db', function(ContainerInterface $c){

    $config = $c->get('db_settings');

    $host = $config->DB_HOST;
    $pass = $config->DB_PASS;
    $charset = $config->DB_CHAR;
    $user = $config->DB_USER;
    $dbname = $config->DB_NAME;
    $port = $config->DB_PORT;

    $opt = [
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_OBJ,
    ];

    $dsn = "mysql:host=".$host.";port=".$port.";dbname=".$dbname.";charset=".$charset.";";

    return new PDO($dsn, $user, $pass, $opt);
}); 

/ Модели /BaseModel.php

<?php

namespace App\Models;

use Psr\Container\ContainerInterface;

class BaseModel{

    protected $container;

    public function __construct(ContainerInterface $c){
        $this->container = $c;
    }
}

/ Models / ApplicantStatus. php

<?php

namespace App\Models;

use App\Models\BaseModel;

class ApplicantStatus extends BaseModel{

    public function __construct($id)
    {
        if(isset($id)){
            $this->id = $id;
        }

    }

    public function getStatusName(){
        var_dump($this->container);
        //get container db
        $pdo = $this->container->get('db');
        $query = $pdo->query('SELECT description_spanish FROM applicant_status WHERE id='.$this->id);

        if($query->rowCount()>0){
            return $query;
        }
    }
}

Когда сделать var_dump () из $ this- > контейнер printa NULL, когда теоретически они угрожают инициализировать и расширить его из BaseModel ...

Этот метод ApplicantStatus-> getStatusName (); он вызывается внутри контроллера.

$status = new ApplicantStatus(11);
$status->getStatusName()

Может быть, я ошибаюсь ...

Спасибо

1 Ответ

0 голосов
/ 17 февраля 2020

решено:

Мне не хватает объявления родительского конструктора.

class ApplicantStatus extends BaseModel
{
    private $id;

    public function __construct(ContainerInterface $c, int $id = null)
    {
        parent::__construct($c);

        $this->id = $id
    }
...
}
...