Один веб-сайт с двумя папками приложений: как я могу поделиться кодом в CodeIgniter? - PullRequest
1 голос
/ 21 августа 2011

У меня есть веб-сайт CI, который содержит две папки приложений, одну для внешнего интерфейса (пользователи) и другую для пользователя с правами администратора:

/applications/front/
/applications/admin/

Внутри /applications/front/helpers/ у нас есть некоторые классы, такие как MY_url_helper.php, и затем, поскольку мы хотим использовать это в области администратора, у нас есть тот же точный код /applications/admin/helpers/MY_url_helper.php - поэтому, когда мы модифицируем код, он находится в двух местах.

Как вы можете себе представить, это противоречит СОО многим правилам! Какой лучший способ поделиться одними и теми же помощниками / библиотеками с двумя приложениями на одном веб-сайте с помощью CI?

1 Ответ

0 голосов
/ 21 августа 2011

Ну, у вас есть несколько вариантов:

  • Оставьте вещи такими, какие они есть, и не беспокойтесь о "нарушении правил". Скорее всего, вы обнаружите, что в конечном итоге вам понадобится совсем другая кодовая база для вашей панели администратора / управления, чем для внешнего интерфейса - поэтому дублирование становится не проблемой, когда вы в конечном итоге пишете другой код.

  • Объедините оба приложения в одно. Это решает проблему дублирования, но заставляет других, таких как необходимость балансировать каждую библиотеку или помощника, для правильной работы в обеих средах. Мой опыт с этим более подробно описан здесь , и здесь есть пост в блоге от разработчика CI Фила Стерджена, который подводит итог, как реализовать эту практику здесь: http://philsturgeon.co.uk/blog/2009/07/Create-an-Admin-panel-with-CodeIgniter

  • Это тот, который я не использовал, но выглядит многообещающе: пакеты.

Приложение "Пакеты"

Пакет приложений позволяет легко распространять полный наборы ресурсов в одном каталоге, в комплекте с его собственным библиотеки, модели, помощники, конфигурационные и языковые файлы. это Рекомендуется поместить эти пакеты в папка application / third_party.

Независимо от рекомендации использовать каталог /third_party, этот может быть любым каталогом, который вы выберете.

Ниже приведен пример каталога для пакета приложения. названный "Foo Bar". / Приложение / THIRD_PARTY / foo_bar

config/
helpers/
language/
libraries/
models/

Независимо от цели пакета приложений "Foo Bar", он имеет свои собственные файлы конфигурации, помощники, языковые файлы, библиотеки и модели. к использовать эти ресурсы в ваших контроллерах, вы должны сначала сказать Загрузчик, который вы собираетесь загружать ресурсы из пакета, путем добавив путь к пакету. $this->load->add_package_path()

Добавление пути к пакету указывает классу Loader, что перед ним стоит путь для последующих запросов ресурсов. Как пример, "Foo Пакет приложения "Bar" выше имеет библиотеку с именем Foo_bar.php. В нашем контроллер, мы бы сделали следующее:

$this->load->add_package_path(APPPATH.'third_party/foo_bar/'); $this->load->library('foo_bar');

Полные детали поясняются в документации к погрузчику: http://codeigniter.com/user_guide/libraries/loader.html

И еще раз, вот еще один пост Фила Стерджена об этом, который может помочь вам понять, как это работает: http://philsturgeon.co.uk/blog/2010/04/codeigniter-packages-modules

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

* Это предположение, на которое я нахожусь при чтении документов, я не проверял это, поэтому может быть что-то еще.

Возможно, вы захотите поместить каталог пакета рядом с двумя другими папками приложения и ссылаться на него в MY_Controller::__construct(), например:

$this->load->add_package_path(FCPATH.'my_package_name/');

Я еще не использовал пакеты, но после написания этого поста - мне очень хочется проверить его для моего следующего проекта.

...