Laravel 5 在共享主机上 - 错误 public_path()

Laravel 5 on shared hosting - wrong public_path()

我将一个 Laravel 5 项目部署到共享主机帐户,将应用程序文件放在 www 文件夹之外,仅将 public 文件夹放在 www 文件夹内。就像这里解释的一样,在最佳答案中:Laravel 4 and the way to deploy app using FTP...没有 3. 因为这个文件在 Laravel 5.

中不存在

现在,当我在控制器内部调用 public_path() 时,我得到类似 my-appfiles-outside-of-www/public 而不是 www/public。有谁知道为什么我在这里没有找到正确的路径?我可以在某个地方更改它吗? 谢谢!

您可以使用容器覆盖 public_path。 示例:

App::bind('path.public', function() {
    return base_path().'/public_html';
});

有许多解决方案,例如更改 index.php 或使用 ioc 容器接受的解决方案。

在我看来,这个 SO 问题中描述了最有效的解决方案:

为什么它比其他解决方案更好?因为它适用于常规的 http 请求,所以使用 artisan 并使用 phpunit 进行测试!例如。对 index.php 的更改仅适用于 http 请求,但在使用 PHPunit 时会导致失败(在我的例子中:file (...) not defined in asset manifest).

对该解决方案的简短回顾: 第 1 步:在文件中:bootstrap/app.php 将 $app 变量的第一个声明从:

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

至:

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

这指向您自己的自定义应用程序 class,我们将在第 2 步中创建它。

第 2 步:在应用程序文件夹中创建文件 Application.php:

<?php namespace App;

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

一定要根据您的需要更改路径。该示例采用如下目录结构:
°°laravel_app
°°°°app
°°°°bootstrap
°°°°配置
°°°°...
°°public_html


如果是 OP,路径可能应该是

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

(从 laravel_app 上升一个,然后下降到 www/public)

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

将上面的代码写在public_html\index.php上面的这段代码

$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);