【问题标题】:Laravel 5 change public_path()Laravel 5 更改 public_path()
【发布时间】:2015-10-23 21:13:23
【问题描述】:

我正在尝试将public 文件夹移动到其他位置。但是,我找不到修改public_path() 变量的地方。现在,'public_path()' 返回了错误的文件夹路径。

在哪里可以设置public_path() 的变量?

【问题讨论】:

    标签: php laravel laravel-5


    【解决方案1】:

    您可以使用 ioc 容器覆盖公共路径:

    完美地为我工作的是在public/index.php 中添加以下三行:

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

    For more detailed explanation click here

    【讨论】:

    • 尝试了您的解决方案,它适用于显示网页。但是,它不适用于工匠命令。工匠仍然将public_path 引用到默认公共路径。
    • @user1995781 您可以在文件“artisan”中应用相同的代码,该文件是命令的“index.php”。
    • 也感谢您提供参考链接。
    【解决方案2】:

    虽然接受的答案适用于来自 HTTP 的请求,但不适用于 artisan

    如果您需要artisan 知道您的自定义公共路径,您需要扩展 Laravel 主应用程序类。我知道这听起来很可怕,但实际上很简单。

    您只需执行以下操作:
    第 1 步: 在文件中:bootstrap/app.php 更改 $app 变量的第一个声明

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

    反映您自己的自定义应用程序类:

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

    第 2 步:在某处定义您的自定义应用程序类。例如app/Application.php

    <?php namespace App;
    
    class Application extends \Illuminate\Foundation\Application
    {
    }
    

    恭喜!你已经扩展了 Laravel 核心 Application 类。

    第 3 步: 覆盖 publicPath 方法。将 Laravel 原始方法复制并粘贴到您的新类,然后根据您的需要进行更改。在我的特殊情况下,我确实这样做了:

    public function publicPath()
    {
        return $this->basePath.DIRECTORY_SEPARATOR.'..'.DIRECTORY_SEPARATOR.'public_html';
    }
    

    就是这样!您可以用同样的方式覆盖 Application 类中的任何方法。

    【讨论】:

    • 关于 Step 3 ... 我应该在 /bootstrap/app.php 的哪个位置放置该覆盖?
    • @dcolumbus 这不应该转到 bootstrap/app.php 文件。它应该在您自定义的 Application 类中,它扩展了 Laravel 核心(步骤 2),因此覆盖了 Laravel 核心 publicPath 方法。
    • 我最初在我的 index.php 文件中有声明,它适用于常规的 http 请求。我在运行 PHPunit 时遇到错误,它说“文件(...)未在资产清单中定义”。原因是它找不到资产清单,因为它没有在正确的公用文件夹中查找。您在此处演示的解决方案解决了这个问题。所以它适用于 HTTP、artisan 和 PHPunit。这应该是公认的答案!
    • 可怕,是的,但它有效。但我不明白为什么这部分 '..'.DIRECTORY_SEPARATOR. 我有这个 return $this-&gt;basePath.DIRECTORY_SEPARATOR.'public_html' 用于共享主机。
    • @FONGOHMARTIN .. 是 Linux 中父目录的名称,而 . 是当前目录。这意味着,我有 public_html 目录从 basePath 上一级,而不是在它里面。
    【解决方案3】:
    $app->bind('path.public', function() {
      return base_path().'/mynewpublic';
    });
    

    【讨论】:

      【解决方案4】:

      建议你添加到app/Providers/AppServiceProvider.php:

      public function register()
      {
          $this->app->bind('path.public', function() {
              return realpath(base_path().'/../public_html');
          });
      }
      

      这也会影响artisan

      【讨论】:

      • 为什么这会影响工匠?
      • 这在某些配置情况下不起作用!当心!但 index.php 一个工作。
      【解决方案5】:

      在 laravel 5.6 中,这对我有用...将此代码添加到 bootstrap/app.php :

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

      其中 __DIR__.'/../' 是您的公用文件夹的路径

      【讨论】:

      • 这个线程提供了很多好的解决方案,我选择了这个。谢谢。
      • 这个工作得很好,当我从 laravel 应用程序文件夹中拆分公用文件夹时,帮助我将文件移动到公用文件夹。谢谢!
      【解决方案6】:

      在我的情况下,在 Laravel 6.0 中工作。
      此文件:bootstrap/app.php

      ......
      $app = new Illuminate\Foundation\Application(
          $_ENV['APP_BASE_PATH'] ?? dirname(__DIR__) );
      
      $app->bind('path.public', function() {
          return realpath(__DIR__.'/../httpdocs'); });
      .....
      

      我更改了public_path()文件夹,这个例子是httpdocs文件夹,你可以放你想要的。

      【讨论】:

      • 只有这个对我有用。与工匠和 HTTP 请求兼容。很好。
      • @X4748-IR 这里也一样。 Laravel 8.40
      【解决方案7】:

      您是否尝试过更新 filesystems.php

      'disks' => [
      
          'public' => [
             'driver' => 'local',
                   'root' => env('PATH_PUBLIC'),
             'visibility' => 'public',
             'url' => env('SITE_ROOT'),
          ],
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-27
        • 2020-07-12
        • 1970-01-01
        • 2019-06-29
        • 2017-07-12
        相关资源
        最近更新 更多