Я делаю простое приложение и изучаю фреймворк Slim 3.
Поскольку я хотел разработать MVC и работать с DIC, я попробовал простое руководство и поставил свою работу поверх него.
- Цель - показать данные из моей базы данных в представлении, используя PDO.
Теоретически это очень просто.
Проблема, я понятия не имею, как получить мои зависимости от моих моделей для вызова PDO, и у меня есть эта ошибка.
Не передавая мой DIC на моих моделях, дизайн и приложение работают просто отлично.
Я могу вызывать свои модели с контроллеров и передавать все что угодно в моих представлениях без каких-либо ошибок.
Ниже приведен мой код, заранее благодарю за ваше внимание.
Начиная с Маршрут Я получаю:
$app->get('/content', \App\Controllers\ContentController::class);
Контроллер
<?php
namespace App\Controllers;
class ContentController
{
protected $container;
// Passes the DIC to get the model.
function __construct($container)
{
$this->container = $container;
}
function __invoke($request, $response, $args)
{
$datas = $this->container->get('contentModel');
$args['content'] = $datas->testContent();
// get the template renderer and pass response and datas to the template file.
return $this->container->get('renderer')->render($response, 'content.php', $args);
}
Вот мои Модели :
<?php
namespace App\Models;
class Model
{
// Passes the DIC to get db later.
function __construct($container)
{
$this->container = $container;
}
protected function executeQuery($sql, $params = null) {
if ($params == null)
{
$result = $this->container->get('db')->query($sql); // direct execution
} else {
$result = $this->container->get('db')->prepare($sql); // prepared execution
$result->execute($params);
}
return $result;
}
}
Мой Модель содержимого
<?php
namespace App\Models;
Class ContentModel extends Model
{
public function testContent()
{
$testDatas = "Hello world";
return $testDatas;
}
public function getContent()
{
$sql = 'SELECT * FROM posts';
$posts = $this->executeQuery($sql);
return $posts;
}
}
Вот мои зависимости :
<?php
use Slim\App;
return function (App $app) {
$container = $app->getContainer();
// View renderer
$container['renderer'] = function ($c) {
$settings = $c->get('settings')['renderer'];
return new \Slim\Views\PhpRenderer($settings['template_path']);
};
// Database
$container['db'] = function ($c) {
$db = $c['settings']['db'];
$pdo = new PDO('mysql:host=' . $db['host'] . ';dbname=' . $db['dbname'],
$db['user'], $db['pass']);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
return $pdo;
};
// Model data stored
$container['contentModel'] = new \App\Models\ContentModel();
};
Я получаю эту ошибку всякий раз, когда хочу передать DIC внутри модели, однако конструктор отлично работает на моих контроллерах.
(!) Фатальная ошибка: Uncaught ArgumentCountError: слишком мало аргументов для функции App \ Models \ Model :: __ construct (), 0 передано в C: \ wamp \ www \ slimappmvc \ src \ dependencies.php в строке 35 и точно 1 ожидается в C: \ wamp \ www \ slimappmvc \ src \ Classes \ Models \ Model.php в строке 8
(!) ArgumentCountError: слишком мало аргументов для функции App \ Models \ Model :: __ construct (), 0 передано в C: \ wamp \ www \ slimappmvc \ src \ dependencies.php в строке 35 и ровно 1 ожидается в C : \ wamp \ www \ slimappmvc \ src \ Classes \ Models \ Model.php в строке 8