2015-06-17 1 views
3

Я видел это,Как выполнить автозагрузку классов с именем файла, отличным от имени класса?

How to autoload class with a different filename? PHP

Load a class with a different name than the one passed to the autoloader as argument

я могу изменить, но в моем MV * структура у меня есть:

/models 
    customer.class.php 
    order.class.php 
/controllers 
    customer.controller.php 
    order.controller.php 
/views 
... 

В фактически классах они,

class CustomerController {} 
class OrderController{} 
class CustomerModel{} 
class OrderModel{} 

Я старался соответствовать именам. Если я не помещаю суффикс имени класса (Controller, Model), я не могу загрузить класс, потому что это обновление.

Если я держу имена моих классов, автозагрузка терпит неудачу, потому что он будет искать файл класса с именем

CustomerController 

, когда имя файла действительно,

customer.controller.php 

ли мои единственными способами (не в порядке):

  • использование create_alias
  • переименовать мои файлы (customer.model.php в customermodel.php)
  • переименовать мои классы
  • использование регулярных выражений
  • использовать загрузчик с включёнными файлами (include, require_once и т.д.)

?

Пример кода,

function model_autoloader($class) { 
    include MODEL_PATH . $class . '.model.php'; 
} 

spl_autoload_register('model_autoloader'); 

Кажется, я должен переименовать файлы,

http://www.php-fig.org/psr/psr-4/

«Имя класса завершающего соответствует имени файла, заканчивающегося на .php. Имя файла должно совпадают с случаем окончания имени класса ».

+2

Ну да, либо сделать свое именование простым или сделать ваш заряжания достаточно умен, чтобы справиться со своими сложными именами. Вы можете делать все, что вам нужно, в автозагрузчике; если есть шаблон для вашего наименования, который может быть выражен в коде, вы можете реализовать его в своем автозагрузчике. – deceze

+0

Ваш автозагрузчик не должен соответствовать PSR-4. Вы не используете Composer, а настраиваете функцию через 'spl_autoload_register()'. Вы можете рассмотреть возможность проверки с помощью 'file_exists()' в функции автозагрузки. –

+0

@deceze Я надеялся, что есть волшебный PHP-способ сделать это. Я сделал это слишком тяжело. Спасибо за помощь. – johnny

ответ

1

Полагает, что это может быть обработано с помощью некоторых основных манипуляций с строкой и конвенций.

define('CLASS_PATH_ROOT', '/'); 

function splitCamelCase($str) { 
    return preg_split('/(?<=\\w)(?=[A-Z])/', $str); 
} 

function makeFileName($segments) { 
    if(count($segments) === 1) { // a "model" 
     return CLASS_PATH_ROOT . 'models/' . strtolower($segments[0]) . '.php'; 
    } 

    // else get type/folder name from last segment 
    $type = strtolower(array_pop($segments)); 

    if($type === 'controller') { 
     $folderName = 'controllers'; 
    } 
    else { 
     $folderName = $type; 
    } 

    $fileName = strtolower(join($segments, '.')); 

    return CLASS_PATH_ROOT . $folderName . '/' . $fileName . '.' . $type . '.php'; 
} 

$classNames = array('Customer', 'CustomerController'); 

foreach($classNames as $className) { 
    $parts = splitCamelCase($className); 

    $fileName = makeFileName($parts); 

    echo $className . ' -> '. $fileName . PHP_EOL; 
} 

Выход

Заказчик -> /models/customer.php

CustomerController -> /controllers/customer.controller.php

Теперь необходимо используйте функцию makeFileName внутри функции автозагрузчика.

Я сам сильно против подобных вещей. Я бы использовал пространства имен и имена файлов, которые отражают пространство имен и имя класса. Я бы также использовал Composer.

(я нашел splitCamelCasehere.)

+0

Можете ли вы объяснить, что вы имеете в виду в пространствах имен? Я знаю, что такое пространства имен, но я не уверен, что вы говорите. Как бы я назвал свои классы, поэтому мне не нужно использовать строковые манипуляции? – johnny

+1

Я не был чист. С помощью этой схемы имен и структуры имен пространства имен будут близки к бессмысленным. Имея пространство имен «Контроллеры», где вы демпируете _all_, контроллеры в вашем приложении бесполезны. Я имел в виду, что я переключу ASAP на значимые пространства имен («Клиенты \\ Контроллеры -> Клиент») и имена файлов ('customers/controllers/customer.php'), которые Composer обрабатывает« по умолчанию ». –