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);
我将一个 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);