Я немного новичок в объектно-ориентированном 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