Каталог файлов и проблема с автозагрузкой PHP MVC

Я создаю структуру MVC PHP, и у меня есть некоторые проблемы с автозагрузкой моих классов, которые, я думаю, могут быть связаны с моей файловой структурой.

Во-первых, вот моя файловая структура:

введите здесь описание изображения

Я тестирую разработку в среде локального сервера Xampp, поэтому у меня есть личные и общие папки. В конце концов, на рабочем сервере личные папки будут находиться в корне сервера, а общие папки будут в каталоге public_html.

Правильно ли выглядит моя файловая структура? в личной папке внешнего интерфейса у меня есть все мои разные модули в каталогах, в которых, в свою очередь, есть файлы контроллера, модели, представления, которые содержат необходимые файлы для каждого модуля.

Я создал этот автозагрузчик до сих пор:

    //Require config and router classes
require_once('router.class.php');
require_once('config.php');

spl_autoload_register(null, false);

spl_autoload_extensions('.class.php');

function autoloader_core($class){
    $filename = strtolower($class) . '.class.php';

    if(!file_exists($filename)){
        echo $filename . " not found";
    }
    include $filename;
}

function autoloader_app($class){
    $filename = strtolower($class) . '.class.php';
    $file = 'C:\xampp\htdocs\simplebids\simplebidsprivate\app/' . $filename;

    if(!file_exists($file)){
        echo $file . " not found";
    }
    include $file;
}

spl_autoload_register('autoloader_core');
spl_autoload_register('autoloader_app');

$router = new test;
$router->say_hello();

Это прекрасно работает для классов в каталоге lib->core, но когда я пытаюсь создать экземпляр нового тестового класса, я получаю всевозможные ошибки о том, что не нашел файл test.class.php в файле lib->core, который он очевидно, что это не так, но я думал, что функция автозагрузчика будет искать путь, определенный мной в функции «autoloader_app».

Забавно то, что хотя я получаю все эти ошибки, строка, которую я повторяю в тестовой функции say_hello(), действительно отображается после ошибок.

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

Есть идеи, почему?

Кроме того, файловая структура моего внешнего модуля очень усложнит автозагрузку, так как мне нужна отдельная функция автозагрузки для каждого модуля, а затем для каждого файла контроллера/модели/представления в нем? мне нужна отдельная функция автозагрузки для каждого модуля? Если нет, как бы я поступил?

Спасибо, Том.


person Tom Burman    schedule 11.04.2014    source источник
comment
где бы у вас были файлы конфигурации. Кроме того, попробуйте добавить функциональность плагина. Это потребуется на более позднем этапе, если вы хотите опубликовать фреймворк для публичного использования.   -  person Guns    schedule 11.04.2014
comment
Не совсем отвечая на ваш конкретный вопрос, но вам действительно следует взглянуть на PSR-0 (и, возможно, PSR-4), когда дело доходит до автозагрузки. Если да, то вы сможете смешивать и сопоставлять другие фреймворды, соответствующие PSR, с вашими (и наоборот). php-fig.org/psr/psr-0   -  person Sarel    schedule 11.04.2014
comment
Вы должны начать использовать пространства имен (PSR-0 подскажет вам, с чего начать)... и перестаньте использовать .class в именах ваших файлов, потому что не все загружаемые вами вещи будут классами.   -  person tereško    schedule 11.04.2014


Ответы (1)


Я бы предложил следующий подход. Это то, что я использую для своих собственных проектов (включая структуру MVC).

Во-первых, соблюдайте следующие правила:

  • Один класс/черта/интерфейс на файл.
  • Используйте имя класса/черты/интерфейса в нижнем регистре в качестве имени файла. Например. класс Foo будет "foo.php"
  • Храните файлы классов/признаков/интерфейсов в пространстве имен в дереве каталогов, соответствующих пространствам имен, с именами в нижнем регистре. например класс \Foo\Bar\Baz будет "/foo/bar/baz.php"

Затем, чтобы активировать самую простую автозагрузку, которую вы когда-либо видели:

Добавьте директорию (y/ies), содержащую все файлы/каталоги классов, в путь включения php:

set_include_path(get_include_path() . PATH_SEPARATOR . ROOT_DIR . "/lib");

Загрузите встроенный автозагрузчик:

spl_autoload_register('spl_autoload', false);

Итак, чтобы привести пример, это структура каталогов моих приложений:

Project Root/
|-apptopnamespace/
| |-controllers/
| | |-dashboard.php
| | |-users.php   
| |-models/
| | |-user.php   
| | |-item.php   
| |-etc/
| |-appname.php
| |-router.php
|-bootstrap.php

Чтобы упростить его, в фреймворке есть метод настройки таких вещей, как автозагрузка, включение путей и т. д.

Таким образом, следующий вызов выполняется в bootstrap.php. Аргумент может легко иметь больше путей в массиве (например, [__DIR__, __DIR__ . DIRECTORY_SEPARATOR . 'lib'], если у вас есть вложенный каталог «lib» в папке проекта):

Bamboo::configure([__DIR__]);

Внутри фреймворк (среди прочего) вызывает эти два метода:

/**
 * Add one or more paths to the include path
 *
 * @param array $paths an array of paths to add to the include path
 */
protected static function addIncludePath(array $paths) {
    set_include_path(
        get_include_path() . PATH_SEPARATOR . implode(
            PATH_SEPARATOR,
            $paths
        )
    );
}

/**
 * Register the SPL Autoloader
 */
protected static function setupAutoload() {
    // Don't clobber any __autoload already defined
    if (function_exists('__autoload')) {
        spl_autoload_register('__autoload', false);
    }

    spl_autoload_register('spl_autoload', false);
}
person Stephen    schedule 01.12.2014