Соответсвенно в строке браузера для перехода ввожу к примеру ?view=main&action=index
По задумке если класса не существует, т.е. если неправильно вписан view=kdvjb то перекидывает на 404. Тут все работает.
А вот при следующей проверке метода к примеру action=jbkdjb меня не перебрасыват на 404, а остаюсь на той же странице и php выдает ошибку Cannot modify header information - headers already sent by (output started at W:\home\localhost\www\avtocms\templates\default\index.php:5) in W:\home\localhost\www\avtocms\core\router.php on line 44
В принципе понятно даже почему, в header уже передан заголовок (если не корректно или не правильно выразился, камнями просьба не закидывать ).
Вот как мне побороть эту ситуацию ума не приложу?!
А почему нет?
Ну хорошо, а как тогда мне сделать видимые переменные для вида? Или как мне вообще в вид делать вставки кода для вывода данных из контроллера?
Все работает, var_dump показывает все что хотел вывести
array(6) { ["adress"]=> string(43) "пр.Косиора, 2А, г.Харьков" ["nav"]=> string(0) "" ["phone"]=> string(19) "+38 (096) 042 78 38" ["day"]=> string(15) "Пн-Сб, Вс" ["time"]=> string(23) "9.00-18.00, 10.00-18.00" ["weekend"]=> string(23) "без выходных" }
А вот с с выводом в виде возникла проблема:
Notice: Undefined variable: a in W:\home\localhost\www\avtocms\templates\default\views\mod_contact.php on line 3
Почему вид не видит переменную "a" из контроллера, данные которой пришли из модели?
Поболтали и разбежались
Просил ответить они тут "дискус" устроили
Честно не вижу в фабрике никакого смысла, по крайней мере каждый раз при вызове фабрики код увеличивается на пару слов.
Пытаюсь просто реализовать так, чтобы как можно было меньше писать и автоматизировать в некотором роде процесс создания объектов для нужных классов.
Поэтому буду наверное использовать свой вариант, на мой взгляд он более короткий в написании и лаконичнее.
В принципе думаю, что логичнее всего в конструкторе контроллера создавать объект модели и далее работать с ним.
В таком случае мне проще создать базовый контроллер с конструктором и наследовать от него, чтобы в каждом контроллере не вызывать каждый раз конструктор. А в дочернем, к примеру в свойстве, писать имя модели.
Набросав структуру БД на листочке и учитывая правило 1 модель = 1 таблица, пришел к выводу, что в моем случае один контроллер может работать и с 2-мя и даже с 3-мя моделями.
Вот здесь я и стал немного в тупик.
Как мне тогда в базовом классе контроллера описать это?
Создать свойство-массив, а в дочерних указывать в этом свойстве ключ-значение типа объект-модель?
Только не пойму как реализовать это через цикл foreach в конструкторе, точнее как мне тогда ключ массива преобразовать в переменную (имя объекта)?
Или не заморачиваться с этим и делать все свойства и методы моделей статическими?
Как Вы поступаете в данной ситуации, уверен что многим приходилось вызывать по несколько моделей из одного контроллера?
Вот я и не пойму, если у меня будит два одинаковых названия класса (а они скорее всего будут) к примеру One в controllers и models. И вызову я этот самый класс, но мне нужен к примеру тот который модель. Автозагрузчик проверит все дирректории, которые я ему указал (т.е. models и controllers) и загрузит оба файла, или загрузит только тот файл который попадется ему первый и на этом остановится?
Достаточно мне в файлах обоих классов One указать разные пространства, а перед вызовом класса указать use и пространство, чтобы php понял какой класс One мне нужен в данный момент?
Ну и в разных классах ессесно где-то разные, где-то одинаковые неймспейсы.
При вызове класса или создании объекта срабатывает автозагрузчик и подключает файл.
Вот теперь не пойму один момент. К примеру у меня 2 одинаковых класса (названия), но в разных пространствах и при вызове класса или создании объекта я укажу use и то пространство которое мне нужно, то как в этом случае сработает автолоадер? Он найдет 2 класса и подключит оба файла (или один который попадется первым?). Или тут в бой войдет еще и сам php и разберется конкретно какой файл ему использовать?
Я вот тут подумал. А что если в каталоге core писать просто функции, которые выполняют общие задачи, т.е. использовать процедурный подход. А далее использовать эти функции уже непосредственно в методах классов.
Я вначале вообще хотел использовать yii, начал даже изучать, но потом сделал для себя вывод, что моих знаний еще маловато (много непонятно) да и весь функционал фреймворка мне нужен. Поэтому для лучшего понимания и изучения ООП думаю лучше писать свое, в чем точно разберусь, ну а потом в будущем уже посмотрим, может и Zend осилю
А вообще пока не хочу использовать готовые решения, ни ORM'ы, хочу написать свой велосипед, сейчас для меня будит так понятнее
Может сейчас и ересь написал, изучаю ООП, пытаюсь нацарапать, что-то похожее на CMS по MVC
Нужно решить следующую задачу:
К примеру в контроллере или модели используются часто одни и те же функции (конкретно в моделе выборка из базы, delete, update и т.п.).
Писать в каждой модели данные функции (ок методы ) не разумно, по-моему проще их вызывать из другого класса и передать им данные на вход для обработки (ну или как-то по-другому, собственно это и пытаюсь узнать).
Про наследование классов знаю, но это не совсем то что мне нужно в данном случае. В моем случае скорее всего будут по одному базовому классу для контроллеров и моделей соответственно, от которых будут наследоваться все остальные. Описывать в них все общие методы мне бы тоже не хотелось (я понимаю что это снова звучит как ересь, иначе зачем тогда создавать базовые классы, но снова повторюсь суть не в том).
Поясню чего хочу добиться...
Структура моего приложения:
/core
/controllers
/models
/views
В каталоге core будут находиться как раз таки все общие классы с методами и свойствами. Эта папка в последующем при разработке и наполнении станет своего-рода фреймворком (моим), который я в будущем хочу использовать в других проектах.
Остальные папки говорят сами за себя.
Базовый контроллер и базовая модель (т.е. родительские классы) будут как бы уникальными для конкретного проекта, а вот все содержимое core будет неизменно и универсально (возможно иногда дополнятся).
Читал про интерфейсы, но это не то. Что-то похожее __call, но как я понял его можно использовать только после создания объекта, а не в классе.
В общем поделитесь пожалуйста опытом, может кто-то решал подобные задачи или подскажите что-то получше.