Управление зависимостями через Include
s /require_once
s в php это боль. Время от времени я меняю вещи и разбиваю вещи, и мне приходится переосмысливать свой подход к инициализации самого первого include () / require () в php. Я чувствую, что мне не хватает более надежной техники, которая бы работала и решала все мои проблемы, но я просто пока не нашел ее.
Автозагрузка с помощью mvc была бы хороша! Но для устаревших процедурных проектов я не думаю, что это помощь?
Наверное, как и все, я начал с относительного пути. require_once('../../../core/core.php');
например. К сожалению, это ломается, когда вы начинаете требовать библиотек, которые имеют свои собственные необходимые зависимости. Итак, я перешел к использованию динамического включения, которое анализирует основную папку проекта из любого места в иерархии: require_once(substr(dirname(__FILE__), 0, strpos(dirname(__FILE__), 'my_project')+8).'core/database/admin.database.connection.php');
это означало, что я мог бы пропустить это где угодно, где это уместно, и переместить его — куда угодно — в проект, и он все равно будет работать! К сожалению, это сломалось, когда я реализовал CI, и проект CI установил корень проекта как: /home/rof/bitbucket.org/repo_name/clone/
который не включал определенную строку «my_project» и таким образом нарушил все включения. Так что в течение последнего часа или около того я исправляю включает, и это не весело. Я хочу найти «окончательное решение».
В настоящее время я изменяю включает в себя:
require_once(realpath(__DIR__.'/../../').'/core/database/admin.database.connection.php');
К сожалению, если я переместлю группу скриптов вверх или вниз по каталогу (например, переместим пользователей / orders / в admin / orders или все различные подходы к ведению домашнего хозяйства), для этого потребуется снова переписать каждый отдельный скрипт. Изменение DIR.’/../../’ к DIR.’/../../../’ или что-то еще. Это отстой, потому что это настолько сложно, что страшно пытаться переписать проект или каталог в целом, что-то, возможно, просто сломается.
Каково окончательное решение для не объектно-ориентированных, процедурных / функциональных php-проектов со сложной структурой каталогов?
Вот почти реальная структура каталогов, которая довольно стандартна, но просто чтобы дать вам представление:
core/
- core.php
- environment.php
- database/
- database.php
- admin.database.connection.php
- user.database.connection.php
- public.database.connection.php
www/
- index.php
- contactus.php
- map.php
- ...
- users/
- login.php
- logout.php
- accountdetails.php
- ...
- admin/
- login.php
- logout.php
- index.php
- admin.php
...
- reports/
- revenue_report.php
- orders.php
- clientslist.php
- orders/
- orderslist.php
- orderview.php
...
Надеемся, что вы поняли идею старой унаследованной системы с процедурным кодом, множеством сложных сценариев и несколькими уровнями доступа к базе данных.
Независимо от процедурного дизайна, у вас должны быть общие файлы, например, config.php
с вашей информацией о соединении БД.
Таким образом, вы можете установить некоторые определения там:
Во-первых, базовый путь вашего приложения относительно файла конфигурации …
define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../'); // or whatever
обратите внимание, начиная с PHP 5.3 вы можете использовать __DIR__
вместо dirname(__FILE__)
Затем вы можете настроить отдельные определения для каждого набора файлов. Может быть:
define('CORE_PATH', APPLICATION_PATH . '/core/');
Тогда в ваших отдельных скриптах вы можете просто сделать
include(CORE_PATH . 'database/admin.database.connection.php');
Или, если вы хотите настроить его, определите путь для /core/database/
вместо этого, и сделайте, например, include(CORE_DATABASE_PATH . '/admin.database.connection.php');
Если вы перемещаете эти папки, вам просто нужно обновить файл конфигурации.
Сейчас я много работал с такими проблемами, и вот что я очень рекомендую во всех случаях: как можно скорее проложите все через фронт-контроллер!
В php чрезвычайно полезно создать фронт-контроллер и обрабатывать все ваши скрипты через него, как только вы сможете его настроить. Если у вас все еще есть устаревшие скрипты, такие как example.php
есть ваш фронт-контроллер index.php
включите их в белый список! Таким образом, URL-адрес, такой как mydomain.com/example, будет маршрутизировать через front-controller, получать все основные включения и только затем включать example.php
Сценарий, если внесен в белый список!
Все остальное просто откладывает неизбежные проблемы объединения сломанной кодовой базы, полной множества крошечных разделенных скриптов.