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

6
我将一个 Laravel 5 项目部署到了一个共享托管账户,将应用文件放在 www 文件夹外面,只将 public 文件夹放在 www 文件夹内部。所有步骤都像这里最佳答案中所解释的那样:Laravel 4 and the way to deploy app using FTP,不需要第三步,因为 Laravel 5 中不存在此文件。
现在当我在控制器中调用 public_path() 函数时,我得到的是类似于 my-appfiles-outside-of-www/public 而不是 www/public 的路径。有谁知道为什么我在这里没有得到正确的路径?我能在哪里进行更改吗? 谢谢!
3个回答

9
您可以使用容器覆盖public_path。 例如:
App::bind('path.public', function() {
    return base_path().'/public_html';
});

1
服务提供者是更好的方式,我认为。 - mcklayin
请问上述代码应该放在哪个文件中?请提供完整的解决方案。 - Marwan
我尝试将代码放入AppServiceProvider类中,但它不起作用。 - Marwan
@Marwan:我现在使用的解决方案是这个:https://laracasts.com/discuss/channels/general-discussion/where-do-you-set-public-directory-laravel-5(请参考DoubleD的“最佳答案”)。 - johnnydoe82

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

将上述代码写入public_html\index.php文件中,写在以下代码之前。
$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);

2
有许多解决方案,比如更改index.php或使用ioc容器的接受解决方案。
我认为最好的解决方案在这个SO问题中描述: Laravel 5 change public_path()
为什么它比其他解决方案更好?因为它适用于常规的http请求,使用artisan和phpunit进行测试!例如,对index.php的更改仅适用于http请求,但在使用PHPunit时会导致失败(在我的情况下:asset manifest中未定义文件...)。
该解决方案的简要概述: 步骤1:在文件bootstrap / app.php中,将$ app变量的第一个声明从:
$app = new Illuminate\Foundation\Application(
    realpath(__DIR__.'/../')
);

to:

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

这指的是您自己定制的Application类,我们将在第2步中创建它。
第2步:在app文件夹中创建Application.php文件:
<?php namespace App;

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

请确保根据您的需求更改路径。本示例假定目录结构如下:
°°laravel_app
°°°°app
°°°°bootstrap
°°°°config
°°°°...
°°public_html


在这种情况下,OP(原帖作者)的路径可能应该是:
return $this->basePath . '/../www/public';

(从laravel_app上一级目录开始,然后进入www/public目录)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接