Alguem pode me ajudar com esse ERRO: Fatal error : Uncaught TypeError: Argument 1 passed to

Fatal error : Uncaught TypeError: Argument 1 passed to Core\BaseModel::__construct() must be an instance of PDO, null given, called in C:\xampp\htdocs\Hotel_MVC\core\Container.php on line 15 and defined in C:\xampp\htdocs\Hotel_MVC\core\BaseModel.php:10 Stack trace: #0 C:\xampp\htdocs\Hotel_MVC\core\Container.php(15): Core\BaseModel->__construct(NULL) #1 C:\xampp\htdocs\Hotel_MVC\App\Controllers\FuncionarioController.php(21): Core\Container::getModel(‘Funcao’) #2 C:\xampp\htdocs\Hotel_MVC\core\Container.php(10): App\Controllers\FuncionarioController->__construct() #3 C:\xampp\htdocs\Hotel_MVC\core\Route.php(69): Core\Container::newController(‘FuncionarioCont…’) #4 C:\xampp\htdocs\Hotel_MVC\core\Route.php(10): Core\Route->run() #5 C:\xampp\htdocs\Hotel_MVC\core\bootstrap.php(5): Core\Route->__construct(Array) #6 C:\xampp\htdocs\Hotel_MVC\public\index.php(5): require_once(‘C:\xampp\htdocs…’) #7 {main} thrown in C:\xampp\htdocs\Hotel_MVC\core\BaseModel.php on line 10

        class FuncionarioController extends BaseController{
public function __construct() {
   parent::__construct();
   $this->post = Container::getModel("Funcionario");
   $this->funcaopost = Container::getModel("Funcao");

}
public function index(){
    $this->view->funcoes= $this->funcaopost->All();
    $this->setPageTitle("Adicionar Usuário");
    return $this->renderView('funcionario/index', 'layout');
}

}

    class Funcionario extends BaseModel{
protected $table = 'funcionario';

public function rules(){
    return [
        'nome' => 'required',
        'cpf' => 'required',
        'usuario' => 'required',
        'senha' => 'required',
        'funcao_id_funcao' => 'required',
    ];
}

}

    class Funcao extends BaseModel{
protected $table = 'funcao';

public function rules(){
    return [
        'tipo' => 'required',
        'descricao' => 'required',
    ];
}

}

abstract class BaseController {
protected $view;
private $viewPath;
private $layautPath;
private $pageTitle = null;

public function __construct(){
	$this->view = new \stdClass;
}

protected function renderView($viewPath, $layaoutPath = null){
    $this->viewPath = $viewPath;
    $this->layautPath = $layaoutPath;
    if($layaoutPath){
        return $this->layout();
    } else {
        return $this->content();
    }
} 

protected function content(){
    if(file_exists(__DIR__ . "/../App/Views/{$this->viewPath}.phtml")){
        return require_once __DIR__ . "/../App/Views/{$this->viewPath}.phtml";
    }else{
        echo 'Error: View path not found';
    }
}

protected function layout(){
    if(file_exists(__DIR__ . "/../App/Views/{$this->layautPath}.phtml")){
        return require_once __DIR__ . "/../App/Views/{$this->layautPath}.phtml";
    }else{
        echo 'Error: Layout path not found';
    }
}

protected function setPageTitle($pageTitle){
    $this->pageTitle = $pageTitle;
}

protected function getPageTitle($separator = null){
    if($separator){
        return $this->pageTitle . " " . $separator . "";
    }else{
        return $this->pageTitle;
    }
}

}

  abstract class BaseModel {

private $pdo;
protected $table;

public function __construct(PDO $pdo) {
    $this->pdo = $pdo;
}

}

    class Container {

public static function newController($contoller){
    $objContoller = "App\\Controllers\\" . $contoller;
    return new $objContoller;
}

public static function getModel($model){
    $objModel = "\\App\\Models\\" . $model;
    return new $objModel(DataBase::getDataBase());        
}

}

A mensagem diz que está sendo passado um parâmetro null para o construtor (functon
__construct ) da classe BaseModel. No caso, parece ser esse aqui:

public function __construct(PDO $pdo) {
    $this->pdo = $pdo;
}

Que é chamado aqui:

public static function getModel($model){
    $objModel = "\\App\\Models\\" . $model;
    return new $objModel(DataBase::getDataBase());        
}

Veja se, por algum motivo, DataBase::getDataBase() está retornando null, ao invés da instância do pdo que você espera.

Obs: duplicado de Alguem pode me ajudar com esse erro: Fatal error: Uncaught TypeError: Argument 1 passed to

Abraço.

Não conseguir resolver ainda…

class FuncionarioController extends BaseController{
public function __construct() {
      parent::__construct();
     //$this->post = Container::getModel("Funcionario");
     $this->funcaopost = Container::getModel("Funcao");
} }

@TerraSkilll quando eu comento umas das linhas do __construct, $this->post ou $this->funcaopost, e código funciona normalmente, acho que o erro esta aqui!?

Você é que precisa determinar o que funciona ou não. O que eu posso fazer é sugerir possíveis causas, baseado nas informações que você passou.

O que eu sugiro é olhar por que o método DataBase::getDataBase() está retornando null no caso que citei acima, porque é o que a mensagem de erro está dizendo. Sua correção de mudar o modelo (getModel) que está sendo chamado provavelmente só está contornando o problema.

Abraço.

1 curtida