MVC, namespace и autoload

DpoHro

Новичок
Товарищи нужен совет.

Проект построен по принципу MVC. Вернее было в нем изначально только VC моделей небыло.
Много дублирующегося кода.
Контроллеры подгружаются классом движка, который имеет в себе сопоставление роутов - контроллерам.

Автоподгрузка классов движка производится тупо ф-ей autoload как проверка файла на существование в директории движка и если он есть - инклуд.

Я хочу этот движок сделать более разумным сделать поддержку моделей и внедрить нэймспейсы.

Нужно чтобы модели и контроллеры были в контексте приложения уже включены и подгружались автоматически при необходимости, без использования конструкций вида use \Myapp\Models\SomeModel;
Вернее хотелось бы чтобы при разработке этого делать не требовалось все было бы спрятано в классах движка.
Как в yii например.
 

AmdY

Пью пиво
Команда форума
autoload работае и для неймспейсов, добавь последним автолодер, проверяющий существование класса в каком-то дефолтном неймспейсе (\Myapp\Models)
 

DpoHro

Новичок
Немного не понял можно на примере? Я так понимаю что внутри _autoloader мне понадобится путь до файла?
 

DpoHro

Новичок
Тогда я не понял, что значит autoload работает и для неймспейсов )) в чем заключается эта работа? Я сурьезно )
 

whirlwind

TDD infected, paranoid
В том что это принцип. Если что то не найдено, то вызвать функцию автолоада. В этом механизме не рассматриваются причины - почему не найдено. Почему не найдено и как это разрулить должна знать функция автолоада, которую ты должен сформулировать.
 

DpoHro

Новичок
Про ф-ю автолоадера я в курсе, но мне в ней нужно знать путь к файлу. Неймспейсов может быть и как правило есть несколько, это и классы движка и классы пользователя (разработчика), у разработчика при этом вообще не должно быть никаких затруднений вызова своих классов - моделей и контроллеров.
 

Вурдалак

Продвинутый новичок
Настало время посмотреть что же передаётся в функцию автолоада при использовании namespaces с помощью оператора echo.
 
  • Like
Реакции: A1x

DpoHro

Новичок
Настало время посмотреть что же передаётся в функцию автолоада при использовании namespaces с помощью оператора echo.
)) Документация говорит мне что передается имя класса.
И я так же понимаю что при вызове
$class = \MyApp\Modules\myModule
$c = new $class;
в автолоадер попадет чтото вроде \MyApp\Modules\Module

Но вот от этого объявления \MyApp\Modules\Module я и хочу избаситься для разработчика, чтобы он не писал \MyApp\Modules\myModule а писал просто:

$obj = new myModule;

и даже если он не знает про неймспейсы.
 

AmdY

Пью пиво
Команда форума
DpoHro
ну вот, а теперь объедини это с моим предыдущим постом
 

Lirik

Новичок
DpoHro
не стоит такого хотеть, иначе придется использовать псевдонимы для каждого файла в неймспейсе
http://habrahabr.ru/blogs/php/72150/
AmdY
как быть если несколько нэймспейсов? к ним же нельзя обращаться в цикле так \$someNSname\....
 

A1x

Новичок
чтобы он не писал \MyApp\Modules\myModule
для этого и предназначен use

и посмотрите все же что передаётся при этом в функцию автолоада с помощью оператора echo.
 

A1x

Новичок
Lirik
если без use то придется всегда использовать имя класса с полным неймспейсом
 

Lirik

Новичок
A1x
вот, и я о том же, ТС походу хочет без use использовать, или не знает о нем. В любом случае использование use, это "ручной" автолоад, по другому никак, да.
 

DpoHro

Новичок
Я знаю про use )))

ТС хочет чтобы было как в yii, но при этом не хочет копать их сорсы.
У них ведь генерится контроллер, модели данных, в контроллере подрубается класс модели простым объявлением, а где инклуды? Их нет )))

Пойду копать про контекст, текущий неймспейс и все такое, мне кажется тут все сокрыто )) По документации yii получается что приложение пользователя выполняется в контексте application в котором как поднеймспейсы содержатся классы пользователя.
Хотя опять чтото не сходится, модели в папке models, а вызов прямой по имени класса.
 

A1x

Новичок
дело даже не в автолоаде а в том что если не писать use то пхп будет сситать ваш класс myModule находящемся в пространстве имен верхнего уровня а никак не в \MyApp\Modules
 

Lirik

Новичок
DpoHro
Ок, скажу тебе что в Yii нужно использовать полное имя,включая НС, вот посмотри код автолоада
Класс модели просто подрубается из папки models, ты же когда создаешь модель не используешь НС.
 

DpoHro

Новичок
Я просмотрел пример создания блога там модели подгружаются без указания каких либо неймспейсов, и вообще нет никакого неймспейса для пользовательских классов, по крайней мере явно не сказано об этом, предполагаю что application.
 
Сверху