我正在使用SLIM 4启动PET项目,但找不到在模型中使用到数据库的连接的方法。甚至控制器也可以正常工作。
我使用了一个容器来移动不同层之间的连接。
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();
configs.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",
];
});
dependencies.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);
});
/ Models / 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;
}
}
}
当使$ this-的var_dump()为容器时,打印为NULL,理论上他们威胁要从BaseModel对其进行初始化和扩展...
此方法ApplicantStatus-> getStatusName();在控制器内部被调用。
$status = new ApplicantStatus(11);
$status->getStatusName()
也许这是我做错了的地方...
谢谢
已解决:
我想念父构造函数声明。
class ApplicantStatus extends BaseModel
{
private $id;
public function __construct(ContainerInterface $c, int $id = null)
{
parent::__construct($c);
$this->id = $id
}
...
}