реализация модели mvc php

164
01 июня 2021, 03:20

Есть проблема подключения модели в контроллерe.Я создал основной метод для подключения файлов моделеи который вызывается при необходимости. Проблмa находится в методе actionServiceinfo() в который подключается requireModel() .Помогите с проблемой .Заранне спасибо

Вот Код

index.php

error_reporting(E_ALL);
ini_set("display_errors", 1);
require_once('Core/Bootstrap.php');
require_once('Core/Controller.php');
require_once('Core/Model.php');
require_once('Core/View.php');
require_once('Core/Database.php');
require_once('config/Database.php');
require_once('config/Secure.php');
$bootstrap = new Bootstrap();

Core/Bootstrap.php

private $controller = NULL;
    private $action = NULL;
    private $params = array();
    private function parseUrl(){
        if (isset($_GET['url'])) {
             $url = Secure::secureUrl($_GET['url']);
             return $url;
        }else{
             require_once('controller/HomeController.php');
             $object = new HomeController;
             $object->actionIndex();
             return false;
        }
    }
    public function __construct(){
        $explode = explode('/', $this->parseUrl());
        if (isset($explode[0])) {
              if (file_exists("controller/".ucfirst($explode[0])."Controller.php")) {
                       $this->controller = ucfirst($explode[0])."Controller";
                       require_once("controller/".$this->controller.".php");
              }else{
                    require_once('controller/ErrorController.php');
                    $object = new ErrorController();
                    $object->actionIndex();
                    return false;
              }
        }

        $object = new $this->controller;

        if (isset($explode[2])) {
             if (method_exists($object, "action".ucfirst($explode[1]))) {
                     $this->action = "action".ucfirst($explode[1]);
                     $this->param = $explode[2];
                     call_user_func([$object,$this->action], $this->param);
             }else{
                    require_once('controller/ErrorController.php');
                    $object = new ErrorController();
                    $object->actionIndex();
                    return false;
              }
        }else{
              if (isset($explode[1])) {
                   if (method_exists($object, "action".ucfirst($explode[1]))) {
                            $this->action = "action".ucfirst($explode[1]);
                            call_user_func([$object,$this->action]);

                   }else{
                         require_once('controller/ErrorController.php');
                         $object = new ErrorController();
                         $object->actionIndex();
                         return false;
                    }
              }else{
                  $object->actionIndex();
              }
        }
    }

}

Core/Controller.php

class Controller{
    public function __construct(){
       $this->view = new View();
    }

     public function requireModel($name){
        $pathe = "model/" . $name . "Model.php";
        if (file_exists($pathe)) {
            require_once($pathe);
            $this->model = new $name."Model";
        }
    }
}

Core/Model.php

class Model{

     public function __construct(){
        $this->db = new Database();
    }
}

Core/Database.php

class Database extends PDO {

    public function __construct(){
        parent::__construct(DB_TYPE . ":host=" . DB_HOST . ";dbname=" . DB_NAME,DB_USER, DB_PASS);
    }
}

Controller/ServiceController.php

class ServiceController extends Controller{
    public function __construct(){
       parent::__construct();
    }
    public function actionIndex(){
        $this->view->render('Service/index');
    }

    public function actionServiceinfo($id = NULL){
        $this->requireModel('Service');
        $serviceModel = new ServiceModel();
        $serviceInfo = $serviceModel->userInfo($id);
        $this->view->render('Service/info',$serviceInfo);
        print_r($serviceInfo);
    }

}

Model/ServiceModel.php

class ServieModel extends Model{
    public function __construct(){
        parent::__construct();
    }

    public  function userInfo($id){
       $studentPrepare = $this->db->prepare("SELECT * FROM `services` WHERE service_id = :service_id");
       $studentPrepare->execute([':service_id' => $id]);
       return $studentPrepare->fetch();
    }
}
Answer 1

Контроллер - это ввод. Играет ту же роль, что и, например, клавиатура, мышка, сканер, микрофон или вебкамера. Контроллер, как устройство ввода, не должен ничего знать про место хранения или способ инициализации классов ваших моделей. Об этом знает абстракция уровнем выше, приложение.

Раз уж вы взялись за реализацию MVC, начните сразу с нормального централизованного загрузчика классов. Для этого в пыхе уже давно есть готовые функции автолоада. Часть устарела, смотрите сразу на свежие в пакете spl, - https://www.php.net/manual/ru/function.spl-autoload-register.php

Как именно хранить и загружать файлы - дело ваше, но сообществом приняты стандарты, среди которых есть и канонический автолоадер - https://www.php-fig.org/psr/psr-4/

Можете просто разобраться в описании стандарта и взять из него же уже готовый пример (ссылка в конце статьи).

Либо, если коротко ответить на ваш вопрос, - файл модели не грузится, потому что или нет файла или путь к нему указан неверно. Выведите отладку и посмотрите по какому именно пути вы ищите файл. Скорее всего там банальная проблема с путями.

P.S. require_once - не функция, а языковая конструкция, и скобки для аргумента не нужны, пишите просто require_once 'имя_файла.php';, без скобок.

READ ALSO
Выполнить код перед отправкой страницы

Выполнить код перед отправкой страницы

Собственно сабж: гугл добавил новый атрибут loading для автоматической ленивой загрузки изображенийКак можно выполнить код на любом языке,...

224
Есть ли готовые библиотеки календаря для telegram bot реализованные на php?

Есть ли готовые библиотеки календаря для telegram bot реализованные на php?

Возможно кому то встречались готовые решения(библиотеки) подобные этой https://githubcom/grcanosa/telegram-calendar-keyboard, написанные на php Буду очень благодарен...

79
Как вычислить расхождение 2 многомерных массивов?

Как вычислить расхождение 2 многомерных массивов?

У меня есть 2 многомерных массива, мне нужно вычислить расхождение между ними, я пробовал их сравнить функцией array_diff но выводит ошибку, как...

94
Почему jname.status и jcontent.status ==0?

Почему jname.status и jcontent.status ==0?

скрипт (данные я получаю нормально):

163