PHP: define('ROOT', strtr(substr(getenv('SCRIPT_FILENAME'), 0, strpos(getenv('SCRIPT_FILENAME'), getenv('SCRIPT_NAME'))), [ '\\' => DIRECTORY_SEPARATOR, '/' => DIRECTORY_SEPARATOR ])); Имеет ли право на жизнь такой код?
в корне сайта лежит index.php и в нем указываем директорию (host не http) сайта PHP: $service = require dirname ( __DIR__ ) . '/Nouvu/service.php'; $app = $service( 'crm' ); $app -> repository -> set( 'app.system.directory.site', __DIR__ ); $app -> kernel -> send(); service.php PHP: <?php use Nouvu\Framework\Foundation\Application; $composer = require 'vendor/autoload.php'; return static function ( string $name ) use ( $composer ): Application { $composer -> addPsr4( \Nouvu\Resources :: class . '\\', __DIR__ . "/{$name}/Resources" ); return new Application( new \Nouvu\Container\Container, include __DIR__ . "/{$name}/tools.php" ); }; на Resources не смотреть. Лень переписывать говно
@MouseZver у меня index.php лежит в public PHP: chdir('..'); spl_autoload_register(function ($class) { if (is_file($file = strtr($class, '\\', '/') . '.php')) { include $file; } }); App::create()->run(); хочу заюзать абсолютные пути с "справильными" слешами p.s. практикуюсь
никогда не используй в своем коде spl_autoload_register и подобное. Когда будешь composer юзать, поймешь. твое приложение должно заготавливать с "правильными" слешами, при чтении конфигов с файлов и сейва в config() --- Добавлено --- PHP: /* - */ \Repository :: class => static function ( ContainerInterface $container ) { // use in each config $app = $container -> get( 'app' ); $repository = new \Nouvu\Framework\Component\Config\Repository; foreach ( glob ( dirname ( __FILE__ ) . '/Configs/*.php' ) AS $file ) { $repository -> set( basename ( $file, '.php' ), include $file ); } $repository -> set( 'app.system.directory', [ 'userdata' => dirname ( __FILE__ ) . DIRECTORY_SEPARATOR, 'root' => dirname ( __DIR__ ) . DIRECTORY_SEPARATOR, 'view' => dirname ( __FILE__ ) . DIRECTORY_SEPARATOR . 'Resources/View/', 'helpers' => dirname ( __FILE__ ) . DIRECTORY_SEPARATOR . 'Resources/System/Helpers/', ] ); return $repository; },
@MouseZver /Configs/*.php 'Resources/View/ 'Resources/System/Helpers/' тут вручную слеши проставлены и множественное использование dirname()
да, самый правильный слэш - это "/". Все, победа. PHP: implode ( DIRECTORY_SEPARATOR, [ 'a', 'b', 'c' ] );
@MouseZver а почему dirname(__FILE__) вместо __DIR__? __DIR__ ведь уже готова, а dirname(__FILE__) ты вычисляешь, а это __DIR__ и есть --- Добавлено --- ага, видел такой фокус, собираю такие а что легче: implode (join) или sprintf?
__FILE__ раньше появилась. В старом коде часто встречается. Или для совместимости. --- Добавлено --- А public чЁ не корень? Вообще у профи фронт лежит вне корня --- Добавлено --- Корень – это «свалка» для публичного статика. --- Добавлено --- Если паблик статик хранится на отдельном хосте, то корень вообще может быть пустым. Файлы типа роботс отдаются фронтом.
а кто меня пустит выше корня на хостинге, если сервак не мой))) ROOT - ***/***/***/domain.name public - ***/***/***/domain.name/public --- Добавлено --- @miketomlin ROOT - это корень сайта (может быть DOCUMENT_ROOT, а может и не быть) public - текущая рабочая директория (может быть DOCUMENT_ROOT, а может и не быть - штекером прислали сюда) PHP: define('ROOT', strtr(substr(getenv('SCRIPT_FILENAME'), 0, strpos(getenv('SCRIPT_FILENAME'), getenv('SCRIPT_NAME'))), [ '\\' => DIRECTORY_SEPARATOR, '/' => DIRECTORY_SEPARATOR ])); // в любом месте ОПРЕДЕЛЕНИЯ константы будет ***/***/***/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 )))
@miketomlin где я такое писал? ты не читаешь мои посты, ясно #13 читай --- Добавлено --- НИ О ЧЁМ я про константу спрашиваю, мне бред в ответ про D_R
Потому что куй меня дернул заюзать в php8 dirname file вместо dir '/a/b/c' или какой рукой лучше ? --- Добавлено --- переменная $_SERVER недоступна при вызове cli --- Добавлено --- корень сайта задается в панеле управления хостом project/public project - /public - /composer - /app и можно не заходить на уровень верх и там весь "my back... my back!!" размещать