У меня есть объектно-ориентированная структура, которая использует дизайн страницы, где каждая страница расширяет представление о структуре.  Так, например, моя индексная страница для сайта на самом деле является классом, который реализует абстрактный класс View представленный каркасом.  Я подключаю фреймворк, включив стартовый скрипт в верхней части страницы, и после некоторой обработки фреймворк создает экземпляр страницы и обрабатывает данные своего представления.  Чтобы добавить гибкость в систему, я не требую, чтобы имя класса было именем самого файла.  Это позволяет мне создать что-то вроде класса поддержки и вести себя как индекс для /support/ subdomain. 
Сначала я передавал имя класса страницы в фреймворк с помощью конструктора фреймворка, но это добавило еще несколько шагов к верхней или нижней части страницы. В настоящее время я получаю имя класса через таблицу страниц в базе данных, идентифицированную фильтрованным запрошенным URI . Я использую эту таблицу для создания навигации, и добавление дополнительной таблицы столбцов было практически бесплатным. Это работает нормально, пока у меня есть соединение с базой данных, но я пытаюсь реализовать статическую поддержку страниц для сообщений о состоянии и отчетов об ошибках, и мне нужен другой метод для создания экземпляра класса страницы. Если я использую стандартное соглашение о присвоении имени имени файла, то я знаю, что у меня есть надежный способ экстраполяции имени класса. Я не хочу называть все индексы моих классов только для объяснения причин. Какой совет или какие-то стандарты для инициализации объектно-ориентированных фреймворков?
 <?php abstract class View { abstract function getView(); } ?> 
 <?php require_once("View.inc"); require_once("CoreController.inc"); $Framework = new CoreController(); $Framework->Initialize(); exit; ?> 
 <?php require_once("Startup.inc"); class Index extends View { public function getView() { echo "<pre>View Data</pre>"; } } ?> 
  В моей структуре у меня есть TemplateController, который обрабатывает страницу.  Класс страницы известен, потому что он отображается другим классом.  Однако без базы данных я хотел бы открыть класс внутри, скажем, index.php без изменения способа его настройки.  Вот фактический код в TemplateController. 
 //Get the View Class from Page $view = $page->getPageClass(); //We need to catch View creation failure $this->Page = new $view($this->Framework); //Initialize the Page View $this->Page->Initialize(); //Cache the Page View $this->cacheView($this->Page, $page->getPageName(), $this->SiteID.TCS_PAGE_SORTID); 
  В фрагменте над представлением $view это фактическое имя класса, сопоставленного с другим контроллером.  Я передаю ссылку на структуру конструктору представления, а остальное действительно не имеет значения.  Я пытаюсь придумать подобный метод сопоставления для определения класса страницы в случае, если база данных не работает.  Мне нравится, что одна включает строку для запуска фреймворка и хотела бы, чтобы это было просто. 
В верхней части TemplateController я также должен повторно включить фактическую страницу, так как мой сценарий запуска находится наверху, фактический класс не включен, даже если это запрошенная страница.
 include($_SERVER['SCRIPT_FILENAME']); 
Просмотрите вопрос о переполнении стека. Идентифицируйте имена классов из $ _SERVER ['SCRIPT_FILENAME'] для получения дополнительной информации о том, что я пытаюсь сделать.
Вот мой контрольный список маршрутизации страницы:
И самое главное – прекратите копирование, подумайте о лучшем подходе.
Все те предложения, которые я использовал в PHP UI framework – Agile Toolkit, где я являюсь автором.
Релевантные источники: Agile Toolkit – PHP Framework с jQuery , Agile Toolkit – PageManager.php , Agile Toolkit – URL.php и Agile Toolkit – PathFinder.php .
Мы хотели сделать это очень простым для разработчиков. И тоже. И гибкий. Поэтому класс «страница» выбирается на основе URL-адреса. Как? Вполне легко:
  /hello.html -> page_hello /hello/world.html -> page_hello_world 
  Затем класс отображается в имя файла. page/hello/world.php 
  Тогда бывают случаи, когда мы также хотим использовать динамические URL-адреса, например: /article/234 
  Многие структуры реализуют здесь сложные методы (массивы, регулярные выражения, фронт-контроллеры).  Мы этого не делаем.  Для этого есть mod_rewrite .  Просто перепишите это в page=article&id=234 и он работает.  И весы. 
Помимо страниц существуют и другие классы, но к этим классам нельзя обращаться напрямую. Поэтому страницы живут в папке / page /, различают их и сохраняют безопасность.
  Затем появляется дизайнер, говорящий: « Я не буду писать PHP ».  Поэтому мы вводим статические страницы.  Если класс page_hello_world не определен, мы рассмотрим template/skin/page/hello/world.html .  Это простой ярлык для дизайнеров и не-разработчиков, чтобы добавить новую страницу. 
  Что делать, если страница не найдена?  Api->pageNotFound() .  Не стесняйтесь переопределять и загружать страницы с SQL или отображать 404 страницу с изображением розового слона. 
И тогда есть несколько страниц, которые поступают из надстроек . Мы не хотим включать их по умолчанию, но вместо этого пользователи могут добавлять их в свое приложение. Как?
 class page_hello_world extends Page_MegaPage 
  Следующий вопрос заключается в том, как мы обрабатываем подстраницы этой страницы, так как иногда вся функциональность не может быть помещена на одну страницу.  Итак, добавим поддержку page_edit() (или любого page_XX) в качестве псевдонима для подстраницы внутри этих классов.  Теперь разработчик дополнений может включать в себя многофункциональную страницу, которая может быть расширена, настроена и размещена в любом месте приложения. 
  Наконец, есть хакеры, которые хотят сделать что-то очень быстро.  Для них мы применяем ту же технику к API.  Вы можете определить функцию page_hello_world в API, и вам не нужен класс. 
Некоторые могут сказать, что существует слишком много способов сделать простую вещь. Ну что ж.
Надеюсь, что это было полезно.
  Используйте __autoload() .  Большинство основных фреймворков PHP используют автозагрузку для оптимизации загрузки классов. 
Вам нужно каким-то образом сопоставить URL-адрес с объектом, который обычно обрабатывается компонентом маршрутизации в большинстве фреймворков. Можете взглянуть на библиотеки, такие как https://github.com/chriso/klein.php , или компоненты маршрутизации основных платформ (Zend, Symfony и т. Д.).
  Почему бы не использовать информацию из URL для определения правильного класса?  Поскольку вы не будете использовать базу данных для статических страниц, вам необходимо каким-то образом сохранить сопоставление между URL и классом в файле.  Т.е. у вас будет файл mapping.php : 
 return array( 'about' => 'AboutView', 'copyright' => 'CopyrightView', ); 
  Здесь и copyright используются URL-адреса, а значения представляют собой соответствующие дочерние классы View .  У вас могут быть URL-адреса, например http://example.com/index.php?page=about, и использовать возможности перезаписи веб-сервера, чтобы они выглядели хорошо. 
  Вы измените реализацию Page::getPageClass() , чтобы вернуть правильный класс представления.  В зависимости от URL-адреса он будет использовать статические сопоставления из вышеуказанного файла или использовать базу данных. 
В чем проблема с этим подходом?