обрабатывать запросы в шаблоне MVC с помощью php

Я читал этот вопрос о как управлять отправкой формы в приложениях php mvc.

Я пытаюсь создать систему маршрутизации, чтобы узнать больше о MVC и php, и я хочу использовать RedBeanPHP в качестве основного ORM. Я не мастер шаблона mvc в php, поэтому у меня есть следующий код, который должен создавать экземпляр относительного контроллера при запросе URL-адреса. Может ли кто-нибудь показать мне правильную реализацию концепции без фреймворка? Другое сомнение касается RedBean. Будет ли загружаться на каждый контроллер, если я настрою его на передний контроллер?

<?php

declare( strict_types = 1 );

require_once __DIR__.'/vendor/autoload.php';

use \RedBeanPHP\R;

$dbh = R::setup();

class Router {

  public static function init()
  {
    $uri = trim(parse_url( $_SERVER['REQUEST_URI'], PHP_URL_PATH ), '/');
      if( $uri != '' ){
        list( $controller, $method, $args ) = explode( '/', $uri, 3 );
          $controller = ucfirst( $controller ).'Controller';
            if( class_exists( $controller ) ){
              if( !isset($args) ){
                call_user_func([new $controller, $method]);
              }
              call_user_func_array( new $controller, $method, [$args] );
            }
      }
      else{
        IndexController::index();
      }
  }

}


class IndexController {

  public static function index()
  {
    //include TEMPLATE_PATH.'/index.php';
    echo 'Hello index';
  }

}

class UserController {

  public function demo()
  { 
    //include TEMPLATE_PATH.'/test.php';
    echo 'Hello demo';
  }

}

?>

Я не уверен, что это правильный способ применения шаблона mvc, это также потому, что если внутри загруженного шаблона представления есть форма, я не уверен, как ею управлять, какой правильный <form action="" > установить. Это также потому, что я буду реализовывать redbean с моделями FUSE для проверки данных.


person Oshione    schedule 05.07.2019    source источник
comment
Абстракция персистентности (это то, чем будет ORM при правильном использовании, а не модель) лучше всего инициализировать по запросу. Чистый способ сделать это — использовать некоторую библиотеку DI Container. Кроме того, ваша маршрутизация ужасна. И имена классов php не чувствительны к регистру, а начиная с 5.3 у нас есть пространства имен, поэтому добавлять суффикс бессмысленно. А статические методы — корень всех зол.   -  person tereško    schedule 05.07.2019
comment
@tereško Я использую добавление слова Controller и функцию ucfirst(), потому что я учусь создавать простой MVC, и в каждой статье, о которой я читал, используется это соглашение об именах. Честно говоря, мне не нравится такой способ называть классы моих контроллеров, я предпочитаю использовать стандартную строчную первую букву без суффикса. Что касается маршрутизации, как я могу ее улучшить, есть ли у вас какие-либо предложения? Почему статические методы — это зло? Что касается DI, есть ли какие-либо предложения, я должен ввести redbean для каждого экземпляра контроллера?   -  person Oshione    schedule 05.07.2019
comment
Поскольку вы используете ORM шаблона активной записи, RedBean будет зависимостью для классов сервисного уровня, а не для контроллеров. Для маршрутизации это может помочь (хотя для этого вам, вероятно, следует использовать стороннюю библиотеку - автономный компонент маршрутизации FastRoute и Symfony популярные варианты). Что касается DIC... эммм... я работал только с Auryn и автономным компонентом Service Container от symfony.   -  person tereško    schedule 05.07.2019
comment
Я рассмотрю ваше предложение по маршрутизации. Я хочу написать свою собственную систему в качестве учебного упражнения, но FastRoute — хорошее решение. Я поищу на github хорошую систему dic   -  person Oshione    schedule 05.07.2019