За последние 24 часа нас посетили 22440 программистов и 1041 робот. Сейчас ищут 632 программиста ...

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

Тема в разделе "PHP для новичков", создана пользователем Вероломство, 18 ноя 2022.

  1. Вероломство

    Вероломство Активный пользователь

    С нами с:
    19 июн 2017
    Сообщения:
    615
    Симпатии:
    24
    PHP:
    1. define('ROOT', strtr(substr(getenv('SCRIPT_FILENAME'), 0, strpos(getenv('SCRIPT_FILENAME'), getenv('SCRIPT_NAME'))), [
    2.     '\\' => DIRECTORY_SEPARATOR,
    3.     '/' => DIRECTORY_SEPARATOR
    4. ]));
    Имеет ли право на жизнь такой код?
     
    #1 Вероломство, 18 ноя 2022
    Последнее редактирование: 18 ноя 2022
  2. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.745
    Симпатии:
    1.319
    Адрес:
    Лень
    в корне сайта лежит 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 не смотреть. Лень переписывать говно
     
    Вероломство нравится это.
  3. Вероломство

    Вероломство Активный пользователь

    С нами с:
    19 июн 2017
    Сообщения:
    615
    Симпатии:
    24
    @MouseZver у меня index.php лежит в public

    PHP:
    1. chdir('..');
    2.  
    3. spl_autoload_register(function ($class) {
    4.  
    5.     if (is_file($file = strtr($class, '\\', '/') . '.php')) {
    6.         include $file;
    7.     }
    8. });
    9.  
    10. App::create()->run();
    хочу заюзать абсолютные пути с "справильными" слешами

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

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.745
    Симпатии:
    1.319
    Адрес:
    Лень
    никогда не используй в своем коде 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.     },
     
    Вероломство нравится это.
  5. Вероломство

    Вероломство Активный пользователь

    С нами с:
    19 июн 2017
    Сообщения:
    615
    Симпатии:
    24
    @MouseZver

    /Configs/*.php
    'Resources/View/
    'Resources/System/Helpers/'

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

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

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.745
    Симпатии:
    1.319
    Адрес:
    Лень
    да, самый правильный слэш - это "/". Все, победа.

    PHP:
    1. implode ( DIRECTORY_SEPARATOR, [ 'a', 'b', 'c' ] );
     
    #6 MouseZver, 18 ноя 2022
    Последнее редактирование: 18 ноя 2022
    Вероломство нравится это.
  7. Вероломство

    Вероломство Активный пользователь

    С нами с:
    19 июн 2017
    Сообщения:
    615
    Симпатии:
    24
    не ну это для слабаков :)

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

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.745
    Симпатии:
    1.319
    Адрес:
    Лень
  9. Вероломство

    Вероломство Активный пользователь

    С нами с:
    19 июн 2017
    Сообщения:
    615
    Симпатии:
    24
    @MouseZver а почему dirname(__FILE__) вместо __DIR__?

    __DIR__ ведь уже готова, а dirname(__FILE__) ты вычисляешь, а это __DIR__ и есть
    --- Добавлено ---
    ага, видел такой фокус, собираю такие

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

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.792
    Симпатии:
    650
    __FILE__ раньше появилась. В старом коде часто встречается. Или для совместимости.
    --- Добавлено ---
    А public чЁ не корень? Вообще у профи фронт лежит вне корня ;)
    --- Добавлено ---
    Корень – это «свалка» для публичного статика.
    --- Добавлено ---
    Если паблик статик хранится на отдельном хосте, то корень вообще может быть пустым. Файлы типа роботс отдаются фронтом.
     
  11. Вероломство

    Вероломство Активный пользователь

    С нами с:
    19 июн 2017
    Сообщения:
    615
    Симпатии:
    24
    ну это 5.2

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

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.792
    Симпатии:
    650
    ROOT'ом принято называть корень. Каталогу над корнем придумай др. название.
     
  13. Вероломство

    Вероломство Активный пользователь

    С нами с:
    19 июн 2017
    Сообщения:
    615
    Симпатии:
    24
    а кто меня пустит выше корня на хостинге, если сервак не мой)))

    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.     '/' => DIRECTORY_SEPARATOR
    4. ])); // в любом месте ОПРЕДЕЛЕНИЯ константы будет ***/***/***/domain.name
     
  14. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.792
    Симпатии:
    650
    Это хрень. Или делай public корнем, или размещай код вне корня. Фронт вынужденно можно оставить в корне, но только его.

    Т.е. можно переместить фронт в паблик (как реальный корень), но не надо пытаться делать воображаемый корень вместо реального.
     
    #14 miketomlin, 18 ноя 2022
    Последнее редактирование: 18 ноя 2022
    Вероломство нравится это.
  15. Вероломство

    Вероломство Активный пользователь

    С нами с:
    19 июн 2017
    Сообщения:
    615
    Симпатии:
    24
    ну так и сделано, мне теперь нужно от корня подключать код, я же в public сижу))) у меня DOCUMENT_ROOT - домен, а текущая рабочая папка - public

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

    чтобы потом не было вот такого - https://yandex.by/search/?text=laravel+public+htaccess&lr=26009&clid=2411726&src=suggest_B
    --- Добавлено ---
    я понял про что ты, я могу и по chdir() поменять рабочий каталог, но это лайфхак, хотелось бы заюзать абсолютные пути с правильными слешами, но из кода получается нагромождение константами, я такое не воспринимаю
     
  16. miketomlin

    miketomlin Старожил

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

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

    Вероломство Активный пользователь

    С нами с:
    19 июн 2017
    Сообщения:
    615
    Симпатии:
    24
    @miketomlin да не в этом вопрос :)

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

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

    miketomlin Старожил

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

    Вероломство Активный пользователь

    С нами с:
    19 июн 2017
    Сообщения:
    615
    Симпатии:
    24
    если у меня 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

    )))
     
  20. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.792
    Симпатии:
    650
    Ты чЁ корнем сайта называешь каталог проекта? Корень сайта определяется соотв. директивой сервера.
     
  21. Вероломство

    Вероломство Активный пользователь

    С нами с:
    19 июн 2017
    Сообщения:
    615
    Симпатии:
    24
    @miketomlin где я такое писал? ты не читаешь мои посты, ясно

    #13 читай
    --- Добавлено ---
    НИ О ЧЁМ

    я про константу спрашиваю, мне бред в ответ про D_R
     
  22. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.792
    Симпатии:
    650
    Вот прям в цитируемом и писал. DOCUMENT_ROOT и указывает на корень сайта.

    Ну, ОК.
     
  23. Вероломство

    Вероломство Активный пользователь

    С нами с:
    19 июн 2017
    Сообщения:
    615
    Симпатии:
    24
    не указывает и никогда не указывал и я не писал обратное
     
  24. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.745
    Симпатии:
    1.319
    Адрес:
    Лень
    Потому что куй меня дернул заюзать в php8 dirname file вместо dir


    '/a/b/c' или какой рукой лучше ?
    --- Добавлено ---
    переменная $_SERVER недоступна при вызове cli
    --- Добавлено ---
    корень сайта задается в панеле управления хостом project/public
    project
    - /public
    - /composer
    - /app

    и можно не заходить на уровень верх и там весь "my back... my back!!" размещать
     
  25. Вероломство

    Вероломство Активный пользователь

    С нами с:
    19 июн 2017
    Сообщения:
    615
    Симпатии:
    24
    аминь (гамон) :)

    пошёл я пиво пить