Вычисляем программно корень сайта

PHP:
  1. define(‘ROOT’, strtr(substr(getenv(‘SCRIPT_FILENAME’), 0, strpos(getenv(‘SCRIPT_FILENAME’), getenv(‘SCRIPT_NAME’))), [
  2.     ‘\\’ => DIRECTORY_SEPARATOR,
  3.     «https://php.ru/» => DIRECTORY_SEPARATOR
  4. ]));

Имеет ли право на жизнь такой код?

 

в корне сайта лежит index.php и в нем указываем директорию (host не http) сайта

PHP:
  1. $service = require dirname ( __DIR__ ) . ‘/Nouvu/service.php’;
  2.  
  3. $app = $service( ‘crm’ );
  4.  
  5. $app -> repository -> set( ‘app.system.directory.site’, __DIR__ );
  6.  
  7. $app -> kernel -> send();

service.php

PHP:
  1. <?php
  2.  
  3. use Nouvu\Framework\Foundation\Application;
  4.  
  5. $composer = require ‘vendor/autoload.php’;
  6.  
  7. return static function ( string $name ) use ( $composer ): Application
  8. {
  9.     $composer -> addPsr4( \Nouvu\Resources :: class . ‘\\’, __DIR__ . «/{$name}/Resources» );
  10.    
  11.     return new Application( new \Nouvu\Container\Container, include __DIR__ . «/{$name}/tools.php» );
  12. };

на Resources не смотреть. Лень переписывать говно

 

@MouseZver у меня index.php лежит в public

PHP:
  1. chdir(‘..’);
  2.  
  3. spl_autoload_register(function ($class) {
  4.  
  5.     if (is_file($file = strtr($class, ‘\\’, «https://php.ru/») . ‘.php’)) {
  6.         include $file;
  7.     }
  8. });
  9.  
  10. App::create()->run();

хочу заюзать абсолютные пути с «справильными» слешами

p.s. практикуюсь :)

 

никогда не используй в своем коде spl_autoload_register и подобное. Когда будешь composer юзать, поймешь.

твое приложение должно заготавливать с «правильными» слешами, при чтении конфигов с файлов и сейва в config()
— Добавлено —

PHP:
  1.     /*
  2.         —
  3.     */
  4.     \Repository :: class => static function ( ContainerInterface $container )
  5.     {
  6.         // use in each config
  7.         $app = $container -> get( ‘app’ );
  8.        
  9.         $repository = new \Nouvu\Framework\Component\Config\Repository;
  10.        
  11.         foreach ( glob ( dirname ( __FILE__ ) . ‘/Configs/*.php’ ) AS $file )
  12.         {
  13.             $repository -> set( basename ( $file, ‘.php’ ), include $file );
  14.         }
  15.        
  16.         $repository -> set( ‘app.system.directory’, [
  17.             ‘userdata’ => dirname ( __FILE__ ) . DIRECTORY_SEPARATOR,
  18.             ‘root’ => dirname ( __DIR__ ) . DIRECTORY_SEPARATOR,
  19.             ‘view’ => dirname ( __FILE__ ) . DIRECTORY_SEPARATOR . ‘Resources/View/’,
  20.             ‘helpers’ => dirname ( __FILE__ ) . DIRECTORY_SEPARATOR . ‘Resources/System/Helpers/’,
  21.         ] );
  22.        
  23.         return $repository;
  24.     },
 

@MouseZver

/Configs/*.php
‘Resources/View/
‘Resources/System/Helpers/’

тут вручную слеши проставлены :)

и множественное использование dirname()

 

да, самый правильный слэш — это «/». Все, победа.

PHP:
  1. implode ( DIRECTORY_SEPARATOR, [ ‘a’, ‘b’, ‘c’ ] );
 

не ну это для слабаков :)

а так-то понятно, что работать прямые будут и там и там

 

603602185569304673.png

 

@MouseZver а почему dirname(__FILE__) вместо __DIR__?

__DIR__ ведь уже готова, а dirname(__FILE__) ты вычисляешь, а это __DIR__ и есть
— Добавлено —

ага, видел такой фокус, собираю такие

а что легче: implode (join) или sprintf?

 

__FILE__ раньше появилась. В старом коде часто встречается. Или для совместимости.
— Добавлено —

А public чЁ не корень? Вообще у профи фронт лежит вне корня ;)
— Добавлено —
Корень – это «свалка» для публичного статика.
— Добавлено —
Если паблик статик хранится на отдельном хосте, то корень вообще может быть пустым. Файлы типа роботс отдаются фронтом.

 

ну это 5.2

ну так ROOT и выйдет туда, не?

 

ROOT’ом принято называть корень. Каталогу над корнем придумай др. название.

 

а кто меня пустит выше корня на хостинге, если сервак не мой)))

ROOT — ***/***/***/domain.name

public — ***/***/***/domain.name/public
— Добавлено —
@miketomlin

ROOT — это корень сайта (может быть DOCUMENT_ROOT, а может и не быть)

public — текущая рабочая директория (может быть DOCUMENT_ROOT, а может и не быть — штекером прислали сюда)

PHP:
  1. define(‘ROOT’, strtr(substr(getenv(‘SCRIPT_FILENAME’), 0, strpos(getenv(‘SCRIPT_FILENAME’), getenv(‘SCRIPT_NAME’))), [
  2.     ‘\\’ => DIRECTORY_SEPARATOR,
  3.     «https://php.ru/» => DIRECTORY_SEPARATOR
  4. ])); // в любом месте ОПРЕДЕЛЕНИЯ константы будет ***/***/***/domain.name
 

Это хрень. Или делай public корнем, или размещай код вне корня. Фронт вынужденно можно оставить в корне, но только его.

Т.е. можно переместить фронт в паблик (как реальный корень), но не надо пытаться делать воображаемый корень вместо реального.

 

ну так и сделано, мне теперь нужно от корня подключать код, я же в public сижу))) у меня DOCUMENT_ROOT — домен, а текущая рабочая папка — public

потому что не все имеют доступ к редактированию хостов, чтобы сервак сразу в public смотрел у него))) поэтому предусмотрен вариант с перенаправлением по штекеру

чтобы потом не было вот такого — https://yandex.by/search/?text=laravel+public+htaccess&lr=26009&clid=2411726&src=suggest_B
— Добавлено —

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

 

Размещай код в каталоге рядом с корнем. Хотя сейчас много вменяемых хостингов, которые рубят фишку и делают корнем domain.name/public ;)

Это заглушка для лохов! Не для реального применения ;)

 

@miketomlin да не в этом вопрос :)

вопрос в том, что, если я константу из вопроса определяю в domain.name/index.php или в domain.name/public/index.php или еще где-то в любом месте скрипта, то она всегда будет иметь значение — ***абсолютный_путь/domain.name, то есть всегда показывает корень сайта, где бы я её не определил, то есть как бы ЛОХ не перемещал скрипт, то она всегда будет правильно смотреть в корень

то есть можно ли таким программным расчётам доверять, универсальна ли она на самом деле?

 

Нет, конечно. Корень может быть и ***/domain.name, и ***/domain.name/public, и ***/domain.name/ХЗЧ, и ХЗЧ вместо domain.name, если я правильно тебя понял. Поэтому в скрипте, запускаемом сервером, можно использовать $_SERVER[‘DOCUMENT_ROOT’] ;) В этом нет ничего зазорного.
— Добавлено —
Т.к. сам фронт может «курсировать» между корнем и, например, каталогом над корнем, ты не вычислишь корень по SCRIPT_FILENAME ;)
— Добавлено —
Т.е. формула все равно будет зависеть от местоположения корня относительно фронта (фронта относительно корня).

 

если у меня DOCUMENT_ROOT — смотрит в public, то мне нужно на уровень выше выходить — В КОРЕНЬ сайта, чтобы подключать остальное — ПРАВИЛЬНО)))

константа из вопроса всегда смотрит В КОРЕНЬ САЙТА)

подключая скрипты мне не нужно делать DOCUMENT_ROOT . ‘/../’, я просто делаю ROOT

понял суть?

если даже где-то бутстрап у меня на несколько уровней ушёл вниз от корня сайта и я там определил константу, потом подключаю бутстрап в любом месте, то у меня константа будет правильно подключать остальное, отстчёт будет всегда от корня сайта — он расчитывается программно, независимо от местоположения файла, в котором определена константа, достаточно подключить файл с определением константы, где бы он не находился
— Добавлено —
@miketomlin

***/***/***/***/domain.name/***/***/***/***/file.php — файл в котором константа

include ‘***/***/***/***/domain.name/***/***/***/***/file.php’;

ROOT — ***/***/***/***/domain.name

***/***/***/***/domain.name/***/file.php — файл в котором константа

include ‘***/***/***/***/domain.name/***/file.php’;

ROOT — ***/***/***/***/domain.name

)))

 

Ты чЁ корнем сайта называешь каталог проекта? Корень сайта определяется соотв. директивой сервера.

 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *