Я немного новичок в объектно-ориентированном PHP и MVC, поэтому мне действительно нужна помощь.
У меня есть структура папок стиля MVC с подпапками в файловой системе
– например, view/classes/subfolder/classname.php
Я использую mod_rewrite для дружественных для человека URL-адресов, таких как /classname
или /foldername/calssname
, которые затем передаются загрузчику страниц в качестве разделительных значений подчеркивания.
– например, foldername_classname
// Файл загрузчика страницы require_once ($ _ SERVER [ 'DOCUMENT_ROOT'] '/ местные / classLoader.php.); session_start (); $ page = new $ _REQUEST ['page'];
Я ранее использовал блок [if / else if / else] для тестирования в каждой возможной папке, но это кажется неэффективным, поэтому я ищу лучший способ поиска автозагрузчика во многих разных местах.
Вот мой последний сбой, который не удается найти ни одного из запрошенных классов и просто выводит исключение для каждого, заканчивая фатальной ошибкой !:
function classToPath ($ class) { $ path = str_replace ('_', '/', $ class). '.php'; return $ path; } function autoloadController ($ class) { echo 'LoadController'. '
«; $ root = '/ controller / classes /'; $ pathtoclass = $ root.classToPath ($ class); пытаться { if (file_exists ($ pathtoclass)) require_once ($ pathtoclass); else throw new Exception («Невозможно загрузить контроллер». $ class); } catch (Исключение $ e) { echo 'Исключение контроллера:'. $ e-> getMessage (). "
«; } } функция autoloadModel ($ class) { echo 'LoadModel'. '
«; $ root = '/ model / classes /'; $ pathtoclass = $ root.classToPath ($ class); пытаться { if (file_exists ($ pathtoclass)) require_once ($ pathtoclass); else throw new Exception («Нельзя загрузить модель». $ class); } catch (Исключение $ e) { echo 'Исключение модели:'. $ e-> getMessage (). "
«; } } функция autoloadView ($ class) { echo 'LoadView'. '
«; $ root = '/ view / classes /'; $ pathtoclass = $ root.classToPath ($ class); пытаться { if (file_exists ($ pathtoclass)) require_once ($ pathtoclass); else throw new Exception («Невозможно загрузить представление». $ class); } catch (Исключение $ e) { echo 'Просмотр исключения:'. $ e-> getMessage (). "
«; } } spl_autoload_register ( 'autoloadController'); spl_autoload_register ( 'autoloadModel'); spl_autoload_register ( 'autoloadView');
/foldername/classname
mod_rewritten в foldername_classname
; classname.php
в папке foldername
; class foldername_classname extends another_class { etc.
php класса class foldername_classname extends another_class { etc.
Это правильный метод?
Скорее случайно, относясь к другому вопросу , я нашел решение своей проблемы !
Поэтому, чтобы ответить на мои собственные вопросы (и, надеюсь, помочь другим):
.../not-this-part/but-this
.../folder/subfolder/class
class folder_subfolder_class {
Затем я написал функцию для каждой системы классов (model, view & controller) и использовал spl_autoload_register()
для регистрации каждой функции как функции __autoload
. Таким образом, …
function loadController ($ class) { $ path = $ _SERVER ['DOCUMENT_ROOT']. '/ application / controller /'; $ filename = str_replace ('_', DIRECTORY_SEPARATOR, strtolower ($ class)). '. php'; if (file_exists ($ path. $ filename)) { require_once ($ путь $ имя_файла.); } } etc..etc .. spl_autoload_register ( 'loadController'); ...
Для тех, кто интересуется частью mod_rewrite
…
IfModule mod_rewrite.c RewriteEngine On RewriteBase / RewriteCond% {SCRIPT_FILENAME}! -f RewriteCond% {SCRIPT_FILENAME}! -d RewriteRule ^ ([az] +) / ([az] +) /? $ /? Page = $ 1_ $ 2 [QSA, NC, L] RewriteRule ^ ([az] +) /? $ /? Page = $ 1 [QSA, NC, L] / IfModule