В новом ядре Битрикс D7, чтобы достучаться до некоторых серверных переменных, нужно использовать специальный класс. Я про такие переменные сервера как IP-адрес, хост, и так далее. Коротенечко пробежимся по классу.
Итак, вызывается переменная так:
$context = \Bitrix\Main\Application::getInstance()->getContext();
$server = $context->getServer(); |
Вот теперь мы можем обращаться к переменным. Перечислю методы, доступные на данный момент:
$server->getDocumentRoot() - док.рут текущий.
$server->getPersonalRoot() - путь Битрикс, по умолчанию равен /bitrix.
$server->getHttpHost() - HTTP_HOST
$server->getServerName() - SERVER_NAME
$server->getServerAddr() - SERVER_ADDR
$server->getServerPort() - SERVER_PORT
$server->getRequestUri() - REQUEST_URI
$server->getRequestMethod() - REQUEST_METHOD
$server->getPhpSelf() - PHP_SELF
$server->getScriptName() - SCRIPT_NAME
Если методов не хватает, можно получить любую переменную $_SERVER таким образом:
$server->get('HTTP_X_REAL_IP');
И есть еще два метода, применение которых на практике я пока не знаю:
public function rewriteUri($url, $queryString, $redirectStatus = null)
{
$this->values["REQUEST_URI"] = $url;
$this->values["QUERY_STRING"] = $queryString;
if ($redirectStatus != null)
$this->values["REDIRECT_STATUS"] = $redirectStatus;
}
public function transferUri($url, $queryString = "")
{
$this->values["REAL_FILE_PATH"] = $url;
if ($queryString != "")
{
if (!isset($this->values["QUERY_STRING"]))
$this->values["QUERY_STRING"] = "";
if (isset($this->values["QUERY_STRING"]) && ($this->values["QUERY_STRING"] != ""))
$this->values["QUERY_STRING"] .= "&";
$this->values["QUERY_STRING"] .= $queryString;
}
} |
.
чем
???
Какой смысл??
Естественно использование не предполагает перед каждым вызовом нужного метода ставить getInstance и так далее. Определите $context в начале файла и все (или в методе своего класса).
Возможно я не прав, но с моей колокольни это выглядит "как сделать всё сложнее, а код более громоздким" - индусский подход по раздуванию кода.
Ну и такая программа, с глобальными, больше уязвима к ошибкам человека (а где ошибка человека, там может быть и ошибка безопасности).
Что будет, если в header.php вставить такой код в конце?
<?unset($APPLICATION)?>
А все, что ниже - умрет. Теперь попробуйте сломать сайт, если мы используем Bitrix\Main\Application::getInstance().
Да, пример надуман, но он показывает, что в случае когда все всё пишут правильно, никто не сможет навредить другим (только себе). Это примерно как новый D7-фильтр. Раньше ошибка в фильтре могла привести к печальным последствиям, сейчас просто выплюнется екзепшен именно тому разработчику, кто такой код пишет.
Все равно неубедительно? Ну вот пример с сабжем:
Да, вполне убедительно. Для командной разработки самое то, наверное.
Когда делаешь один и хотя бы примерно помнишь, где и что писал, шанс таких ошибок минимален.
Правда, так нормальной документации по D7 не попадалось, в основном небольшие заметки от вас и других разработчиков, а вот документации - не, не видел.
Когда-то делал большой каталог на highload (под миллион товаров) с использованием D7 - обплевался, сколько "лишнего" надо писать, что бы сделать чуть-чуть. На этот D7 еще свою обертку писать надо, что б удобно было
ООПшный подход, кроме прочего, даёт гарантию того, что вы будете правильно работать с данными. Вы просто говорите синглтон-классу, что ему нужно сделать, а вся магия происходит под капотом. Во-первых, вы не забудете произвести важные операции (если они нужны, скорее всего, они уже будут записаны в классе), во-вторых у вас будет поддержка обновлений. Появилась необходимость производить доп. операции при записи какой-либо переменной — правим только метод set() класса.
В плане документации выступлю в защиту Д7. Все методы и классы в новом ядре документируются, а названия им даются «человеческие». Поэтому, просто начинайте в своей ИДЕ писать название сущности, с которой хотите работать, и смотрите результаты автокомплита.
Отвечая сразу всем интересовавшимся скажу, что для больших проектов, а так же для проектов, в которые вовлечены более пары человек, нет особых альтернатив ООП подходу. Да, код становится объемнее. Потому что нет панацеи. За все надо платить. Но код становится более устойчивым и управляемым. Ведь данные скрываются областью видимости, предоставляя наружу только методы для управления. Появляется возможность динамически подменять поведение. Существенно упрощается дальнейшее развитие кода. Ну и т.п.
Стоит заметить также, что на текущих версиях php целесообразно применять комбинированный подход. Т.е. там, где достаточно массивов, делать объекты может оказаться не целесообразно по вопросам производительности.
А я целый год ждал скидку, как-то чисто случайно у меня винда заглючила, я ее переустановил, зашел скачать новый PhpStorm, на тебе, получите распишитесь:)
Расмус не для этого создавал PHP.
фильософия PHP - это быстрый доступ к основным переменным веб окружения, разбиение приложения на независимые скрипты (микросервисы), встроенный набор функций выполняющий типовые задачи.
то что сейчас пытаются реализовать в Bitrix - программировать с такими подходами можно было делать еще лет 10 на java.
Это, вроде как
проще заменить этим:
Ну и далее просто
Поблема - путь откуда вызывается приложение не соответствует пути которые подставляется в include, в одном случае home/bitrix/www/ в другом work/bx/www.
Ответ1: Скорее всего проблема в символической ссылке на корневую папку сайта, мы это тоже тестируем.
Ответ2: В данной ситуации мы можем посоветовать только одно, с учётом того, что сейчас ядро продукта не работает по большей части с D7 (код которого Вы используете), также пока не использовать эти экспериментальные классы.
Так что будьте осторожны с использованием данного метода, если у вас идут символические ссылки на папки.