2013-03-23 2 views
3

Я уже много читал об этом, но до сих пор не нашел (или не смог создать) правильный ответ.Имеют доступ к общему классу в фреймворке PHP MVC

Я работаю над небольшой инфраструктурой MVC, и мне нужен какой-то глобальный класс/объект, который я могу вызвать из своих контроллеров (но, может быть, и моделей).

Есть несколько маршрутов, я могу взять с собой:

  1. Глобальная переменная
  2. Статический класс/Реестр
  3. Dependency Injection

Интернет, кажется, согласны, что DI является лучший маршрут. Я думаю, что понял эту идею, но пока не уверен. Поэтому я хочу бросить некоторую справочную информацию; Я, вероятно, буду работать только над проектом, это небольшой проект, все мои контроллеры расширяют основной контроллер (чтобы я мог просто загружать одну библиотеку, например, класс).

Как конкретный пример, я хочу иметь массив категорий. Поэтому я начал с размещения этого массива в CategoryController. Но теперь я заметил, что я хочу использовать этот массив в моем представлении и в ProductController. Очевидно, что я не хочу загружать все CategoryController в ProductController. Вы также можете сказать, что я могу поместить этот массив в какой-то файл конфигурации или настроек из-за простоты этого примера, но вот почему это пример. Я, вероятно, расширю его с большей функциональностью.

Итак, чтобы обобщить: В PHP (в частности, в модели MVC), как вы можете предоставить своим классам (главным образом контроллерам) доступ к некоторому классу или другим совместным функциям.

+0

Почему вы контролируете что-либо помимо обработки запроса и получения ответа? – PeeHaa

+1

Наверное, потому что это не идеально, и я сделал это сам. –

ответ

2

Ваши контроллеры созданы с помощью «чего-то» (обычно переднего контроллера). Поэтому, когда контроллер создан, вы можете ввести контейнер инъекции зависимостей.

И в вашей конфигурации/начальной загрузке (перед созданием контроллера) вам следует добавить категории в контейнер.

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

Обратите внимание, что это простой пример, который не полностью соответствует духу инъекции зависимости. Лучшим решением было бы прямо вводить категории (вместо инъекции контейнера). Но это может стать большой работой, если вы обобщите этот шаблон (много зависимостей для обработки в вашем переднем контроллере).

Решение будет заключаться в использовании инфраструктуры инъекций зависимостей, которая может сделать это для вас.

Например, я работаю над контейнером DI, который позволяет вводить элементы с аннотациями (PHP-DI), но есть несколько других библиотек для DI, поэтому у вас есть выбор.

+0

Но это как черный ящик. Из-за MVC контроллеры вызываются автоматически-магически. Итак, все мои контроллеры получат один и тот же контейнер DI. Или я должен указать в файле конфигурации, какой контроллер получает? –

+0

Это не проблема, если они получают все тот же контейнер (вы выбираете, какие данные вы хотите в нем).Как я уже сказал, это сокращенная версия правильной инъекции зависимостей. С помощью DI вы не будете вводить контейнер, кроме зависимости (например, вы должны вводить массив категорий в нужные ему контроллеры). –

+0

Итак, в общем, либо вы хотите сделать «правильный» DI, то вы должны указать, какой контроллер получает то, что с файлами конфигурации (например), и развить материал, чтобы заставить его работать (или использовать библиотеку DI). Или либо вам все равно (вы хотите, чтобы материал работал), и вы вводили контейнер, и все готово! Это действительно зависит от того, серьезен проект, не переутомляйте, если для вас работает быстрое и грязное решение. –

-1

Мои 2 цента:

В небольшой самодельный мини-рамки я сделал некоторое время назад, я создал глобальный класс синглтон с именем приложения, и все/все, что должны быть доступны из любой точки мира/везде было свойством или методом этого класса.

В моем случае было $db свойства для доступа к базе данных, $user свойства для доступа к данным пользователей и методы, $input собственности на «питание» $_REQUEST доступа, и так далее.

Конечно, у вас есть много других вариантов, подходящих для разных сценариев. Этот подход просто отлично справился со мной по этому поводу.

Теперь, если вы хотите получить доступ к контроллеру с другого контроллера, это действительно звучит странно. Эта «вещь», к которой вы хотите получить доступ, должна быть классом модели, классом библиотеки или чем-либо еще, но не должна быть «заблокирована» внутри класса контроллера. В самом деле, контроллер должен быть «как можно более тонким» и сосредоточиться на вызове присвоенных методов из других классов на основе пользовательского ввода (запроса), а затем вызова некоторого метода вывода для генерации и отправки ответа (ответа).

Наконец, хотя я читал некоторые критические замечания и жалобы (а также похвалы), я часто использую методы static, в основном для классов, которые являются более «помощниками», чем что-либо еще.

+1

Похоже, очень сложно поддерживать «глобальный» праздник. – PeeHaa

+0

Да, я бы не назвал это так. Я ищу больше для объекта, подобного библиотеке, да. –

+0

Трудно поддерживать? ... не совсем, ничего сложного. Класс Application был очень тонким. «Db», «user», «input», «cache» и другие классы для использования в любом приложении были хорошими и более надежными. –