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

时间:2015-04-27 09:35:44

标签: php laravel-5 shared-hosting

我将Laravel 5项目部署到共享主机帐户,将应用程序文件放在www文件夹之外,只将公共文件夹放在www文件夹中。所有这些都在这里解释,最好的答案是:Laravel 4 and the way to deploy app using FTP ...没有3.因为这个文件在Laravel 5中不存在。

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

3 个答案:

答案 0 :(得分:5)

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

mysql> select e.id,
e.name,
s.skillset from employee e 
join employee_skills es on es.idemployee = e.id 
join skillset s on s.id = es.idskills where s.id = 1 ;
+------+------+----------+
| id   | name | skillset |
+------+------+----------+
|    1 | xyz  | Python   |
|    2 | abc  | Python   |
|    3 | lmn  | Python   |
+------+------+----------+

答案 1 :(得分:2)

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

在我看来,最有效的解决方案在此SO问题中有所描述: Laravel 5 change public_path()

为什么它比其他解决方案更好?因为它适用于常规的http请求,使用工匠和使用phpunit进行测试!例如。对index.php的更改仅适用于http请求,但在使用PHPunit时会导致失败(在我的情况下:文件(...)未在资产清单中定义)。

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

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

为:

$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
°°°°应用
··引导
°°°°配置
°°°°...
°°的public_html


如果是OP,路径应该是

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

(从laravel_app开始,然后进入www / public)

答案 2 :(得分:1)

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

在此代码上方的public_html \ index.php中编写以上代码

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