Как получить точную папку проекта в PHP - PullRequest
0 голосов
/ 31 мая 2018

Я действительно провел много исследований по этому поводу, но похоже, что это отличается от других.Итак ... теперь у меня есть папка проекта todo-oop, и я хочу получить только точное местоположение / URL этого проекта, поэтому я хочу получить http://localhost/todo-oop/.

Код:

<?php
  $project_folder = explode('\\', dirname(__FILE__));
  $root_directory = $_SERVER['SERVER_NAME'] . '/' . end($project_folder);
?>

Вывод:

localhost/partials/css/todo.css

Если я проверю источник просмотра и нажму URL, он вернет неправильныйurl: http://localhost/todo-oop/localhost/partials/css/todo.css

Я хочу добиться того, как laravel обрабатывает свои файлы css / js / img, используя asset() вспомогательную функцию.

Ответы [ 3 ]

0 голосов
/ 31 мая 2018

Одной из замечательных особенностей PHP является то, что вы можете читать исходные тексты.Если вы хотите узнать, как работает функция asset(), вы можете просто прочитать код!

// Illuminate/Foundation/helpers.php
function asset($path, $secure = null)
{
    return app('url')->asset($path, $secure);
}

Таким образом, вы даете функции asset путь к тому, что вы хотите включить.Функция asset по очереди передает ее экземпляру контейнера для разрешения (app()), а затем Laravel запускается с огромным количеством магии.Короче говоря, он просто пытается найти правильный URL-адрес по указанному вами пути.

Недостатком Laravel является то, что он использует много магического кода, чтобы не допустить появления шаблонов.Это часто полезно, но может затруднить понимание того, что происходит внутри.Фреймворки часто имеют этот компромисс между образцом и магией, когда Laravel стремится отказаться от образца, когда это возможно.

Теперь к ответу

Что вы можете сделать, этот Laravelделает довольно умно, это установить свойство / global / variable всякий раз, когда кто-то подключается к вашему приложению.

// bootstrap/app.php
$app = new Illuminate\Foundation\Application(
    realpath(__DIR__.'/../')
);

// Illuminate/Foundation/Application
public function __construct($basePath = null) 
{
    if ($basePath) {
        $this->setBasePath($basePath);
    }
}

Теперь вы можете получить доступ к этому пути (который является корнем проекта) из любой точки вашего приложения, вызвав помощник base_path().Что на самом деле возвращает тот точный путь, который мы только что установили:

function base_path($path = '')
{
    return app()->basePath().($path ? DIRECTORY_SEPARATOR.$path : $path);
}

Надеюсь, этот ответ вам немного помог!

0 голосов
/ 31 мая 2018

Как было предложено, простое решение - создать файл конфигурации (json, xml или php - я буду использовать последний) , который содержит важную информацию, найденную в корне вашего домена, в этомв случае доменного имени:

/ config.php

<?php
define('DS',DIRECTORY_SEPARATOR);
define('ROOT_DIR',__DIR__);
define('INCLUDES',ROOT_DIR.DS.'includes');
define('FUNCTIONS',INCLUDES.DS.'functions');
# Define base domain
define('SITE_URL','//localhost');

Это будет просто объединить путь проекта (если установлен).

/include/functions/asset.php

function asset($path=false)
{
    # Check if a project folder is set
    $proj     = (defined('PROJECT_NAME'))?  PROJECT_NAME : '';
    # See if the current mode uses SSL
    $protocol = (isset($_SERVER['HTTPS']))? 's' : '';
    # Create a path (if no project, it will leave "//" so you need to replace that)
    $final    = str_replace('//','/','/'.trim($proj,'/').'/'.ltrim($path,'/'));
    # Send back full url
    return "http{$protocol}:".SITE_URL.$final;
}

Это в основном то, что вы будете делать.

/ index.php

<?php
# Include config
require_once(__DIR__.DIRECTORY_SEPARATOR.'config.php');
# Include the asset function
include_once(FUNCTIONS.DS.'asset.php');
# Define the current project. If you are always accessing this,
# then you may want to have it in the config, but if you are doing multiple projects
# you can leave the define in the root of each project file
define('PROJECT_NAME','todo-oop');
# Use asset to write the asset path
echo asset('/partials/css/todo.css');

В нем должно быть написано:

http://localhost/todo-oop/partials/css/todo.css

Если проект не определен:

http://localhost/partials/css/todo.css

Вы также можете изменить SITE_URL, чтобы включить каталог проекта, если у вас есть доступ только к одному проекту с одиночной конфигурацией:

define('SITE_URL','//localhost/todo-oop');

Как продемонстрировал @Loek, вы можете использоватьфреймворк создает такие пути и тому подобное, или вы можете создавать классы (если вы достаточно уверены в этом) , чтобы делать то, что я демонстрирую.Преимущества использования классов / фреймворков в том, что они будут иметь большую гибкость и динамическое взаимодействие, но для очень простого процесса вы можете использовать эти типы путей, используя приведенную выше методологию.

0 голосов
/ 31 мая 2018

Попробуйте это

<?php echo "http://" . $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI'].'/'; ?>

Согласно этому ответу , надеюсь, это сработает.

...