Прежде чем я начну, этот фреймворк не должен конкурировать с Zend, Symfony, Cake или любым другим фреймворком. Это в первую очередь личный проект, так что я могу испытать некоторые вкусности PHP 5.3, испытать новые методы и дать мне возможность попробовать что-то в соответствии с моей идеей. Я также пытаюсь сделать этот каркас как можно более легким и уменьшить количество ненужных методов получения и установки. Теперь о проблеме.
Большая часть фреймворка выполнена, в первую очередь все основные классы, необходимые для его работы. Проблема возникает на точке входа приложения. Я хочу, чтобы все приложение запускалось через один основной объект, который разветвляется. Базовый объект будет расширен классами для управления средами, конфигурацией, реестром, автозагрузкой, маршрутизацией и т. Д. И т. Д. Вы можете увидеть этот «базовый» объект ниже, он точно называется Application.
https://github.com/titon/titon/blob/42c88e36c29e3d8c697306fe68be18b3a8fd2e70/titon/source/Infrastructure.php
$app = new \titon\source\core\Application();
Идея заключалась в том, что из любой точки приложения вы можете получить доступ к основным объектам через эту переменную $ app. Пример:
(Я не могу опубликовать более 1 ссылки, поэтому перейдите в следующие каталоги на Github. /App/config/Setup.php и /app/modules/core/Bootstrap.php)
$app->environment->current();
$app->loader->includePath(array(__DIR__));
$app->registry->factory('titon\source\system\Controller');
Но теперь мы попадаем в проблему глобальных переменных, которую я не хочу использовать. Мне также нравится стараться избегать синглетонов.
public function foobar() {
global $app; // Eww
}
Но я также не хочу использовать статические классы, так как я пытался использовать более ООП подход. Единственное решение, которое я могу придумать, - это использовать свойство статического класса для хранения экземпляра приложения и доступа к нему везде, но мне это не нравится. Или я могу снова и снова передавать объект его детям, но опять же, не поклоннику.
Core::$app->router->detect(); // Meh
$this->setApplication($this); // Mehher
Мне было любопытно, как Zend и Symfony подошли к этой проблеме. Но, просмотрев их исходный код, я не смог задом наперед разработать и определить правильную точку входа. Более того, казалось, что Zend будет создавать глобальные переменные повсюду (Zend_Config и т. Д.), Но я бы предпочел иметь управляющий объект. Symfony 2.0, я просто потерялся. Что касается Cake, Solar, Fuel, кажется, они используют статические классы для таких объектов.
Теперь мой основной вопрос: как бы вы решили это? Я хотел бы сохранить один объект для создания экземпляра и быть доступным везде, но это не кажется легким в обращении. Я готов переписать многие рамки, если это будет необходимо.