Как получить доступ к библиотекам внутри контроллера? - PullRequest
2 голосов
/ 18 декабря 2011

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

Я застрял на лучший способ получить доступ к библиотекам из контроллера. Первоначально я реализовал систему, аналогичную CodeIgniter, в которой мой основной класс контроллера в основном является суперобъектом и загружает все классы в переменные класса, к которым затем осуществляется доступ посредством расширения контроллера и действия, подобные $this->class->method()

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

Какой самый лучший (самый чистый) способ сделать это?

Ответы [ 3 ]

2 голосов
/ 18 декабря 2011

PHP обеспечивает функцию автозагрузки с SPL и spl_autoload (и связанными функциями).Вы можете зарегистрировать пользовательский автозагрузчик для кода своей библиотеки.

Для общих функций, обрабатываемых вашим приложением, вы рассмотрели шаблон проектирования Front Controller ?

2 голосов
/ 18 декабря 2011

Чтобы иметь только один экземпляр каждого класса, вы можете создать простой сервисный контейнер.

class ServiceContainer
{
    protected $services;

    public function get($className)
    {
        if (!array_key_exists($className, $this->services)) {
            $this->services[$className] = new $className;
        }

        return $this->services[$className]
    }
}

Затем создайте один экземпляр ServiceContainer для каждого приложения. Введите контейнер во все ваши контроллеры и используйте

public function someAction()
{
    $this->container->get('Mailer')->send($email_data);
}

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

2 голосов
/ 18 декабря 2011

Мне не нравится, как CodeIgniter делает это.Это никогда не казалось мне правильным.Я предпочитаю класс автоматической загрузки, помещенный в стек spl_autoload.А затем просто вызывать класс как обычно:

$class = new SomeClass();

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...