Неустранимая ошибка: Uncaught ArgumentCountError: слишком мало аргументов для функции App \ Models \ Model - PullRequest
0 голосов
/ 16 мая 2019

Я делаю простое приложение и изучаю фреймворк 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

1 Ответ

0 голосов
/ 17 мая 2019

ContentModel использует тот же конструктор, что и ваш класс Model, потому что вы не перезаписали его при расширении, а конструктор для Model требует 1 аргумент при создании экземпляра класса «$ container». Поэтому, когда вы создаете экземпляр ContentModel, вам также необходимо передать ему аргумент:

$container['contentModel'] = new \App\Models\ContentModel($container);

Я предполагаю, что переменная $ container - это то, что ожидает класс Model.

...