Laravel 5 на виртуальном хостинге - неправильный public_path ()

Я развернул проект Laravel 5 в учетной записи общего хостинга, разместив файлы приложений за пределами www-папки, поместив только общую папку внутри www-папки. Все, как описано здесь, в лучшем ответе: Laravel 4 и способ развертывания приложения с использованием FTP ... без 3. потому что этого файла нет в Laravel 5.

Теперь, когда я вызываю public_path () внутри контроллера, я получаю что-то вроде my-appfiles-outside-of-www / public вместо www / public . Кто-нибудь знает, почему я здесь не иду по правильному пути? Могу я это где-нибудь поменять? Спасибо!


person johnnydoe82    schedule 27.04.2015    source источник


Ответы (3)


Вы можете переопределить public_path с помощью контейнера. Пример:

App::bind('path.public', function() {
    return base_path().'/public_html';
});
person mcklayin    schedule 27.04.2015
comment
Я думаю, что сервис-провайдер - лучший способ сделать это. - person mcklayin; 27.04.2015
comment
Какой файл над кодом разместить, опубликуйте полное решение - person Marwan; 19.05.2016
comment
Я попытался поместить код в класс AppServiceProvider, но он не работает - person Marwan; 19.05.2016
comment
@Marwan: Сейчас я использую следующее решение: https://laracasts.com/discuss/channels/general-discussion/where-do-you-set-public-directory-laravel-5 (см. лучший ответ от DoubleD ) - person johnnydoe82; 01.07.2016

$app->bind('path.public', function() {
  return __DIR__;
});

напишите приведенный выше код в public_html \ index.php выше этого кода

$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);
person Mahdi mehrabi    schedule 23.12.2018

Есть ряд решений, например, изменение index.php или принятое решение с контейнером ioc.

На мой взгляд, решение, которое работает лучше всего, описано в этом вопросе SO: Laravel 5 change public_path ( )

Почему это лучше других решений? Поскольку он работает с обычным HTTP-запросом, используйте ремесленник и использование phpunit для тестирования! Например. изменение index.php работает только для HTTP-запросов, но приводит к сбоям при использовании PHPunit (в моем случае: file (...) не определен в манифесте ресурса).

Краткое описание этого решения: Шаг 1: В файле: bootstrap / app.php измените самое первое объявление переменной $ app с:

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

to:

$app = new App\Application(
    realpath(__DIR__.'/../')
);

Это указывает на ваш собственный класс Application, который мы создадим на шаге 2.

Шаг 2: Создайте файл Application.php в папке приложения:

<?php namespace App;

class Application extends \Illuminate\Foundation\Application
{
   public function publicPath()
   {
       return $this->basePath . '/../public_html';
   }
}

Обязательно измените путь под свои нужды. Пример предполагает такую ​​структуру каталогов:
°° laravel_app
°°°° приложение
°°°° bootstrap
°°°° config
°°°° ... < br> °° public_html


В случае OP путь, вероятно, должен быть

return $this->basePath . '/../www/public';

(вверх на один от laravel_app, затем вниз на www / public)

person mcProgrammer    schedule 22.09.2016