如何覆盖 Illuminate/Foundation/Application.php 中定义的 resourcePath() 函数

How to override the resourcePath() function defined in Illuminate/Foundation/Application.php

我正在模块化 laravel。我决定将所有默认路由、控制器、资源等移动到 /app/Modules/Pub。在大多数情况下,这很有效。但是我想更改应用程序的默认资源路径。不幸的是,这似乎不是(容易)配置的。

所以...使用 grep 我能够追踪 resource_path() 函数到 /var/www/sigma/vendor/laravel/framework/src/Illuminate/Foundation/helpers.php

我认为可以在某处重写此函数,但这似乎是一个低于标准的 hack,因为此函数仅包含:

app()->resourcePath($path)

再次使用grep我发现这个函数是在/var/www/sigma/vendor/laravel/framework/src/Illuminate/Foundation/Application.php

中找到的

这似乎是要更改的地方,因为它不引用任何配置值,而是硬编码的值:

return $this->basePath.DIRECTORY_SEPARATOR.'resources'.($path ? DIRECTORY_SEPARATOR.$path : $path);

但我认为可以肯定地假设手动更改 vendor 文件夹下的任何内容是非常愚蠢的。显然我需要在某处重写这个函数。我不清楚在哪里以及如何执行此操作

您可以在项目的某处创建一个 class 并扩展默认的 \Illuminate\Foundation\Application class。然后覆盖您需要的方法,并将 bootstrap/app.php 中实例化的 class 切换为您的自定义方法。

创建一个新的 Application class 来扩展 \Illuminate\Foundation\Application:

<?php

namespace <YOUR NAMESPACE HERE>;

class ApplicationCustom extends \Illuminate\Foundation\Application
{
    public function __construct()
    {
        parent::__construct();
    }
    /**
     * Get the path to the resources directory.
     *
     * @param  string  $path
     * @return string
     */
    public function resourcePath($path = '')
    {
        // Implement the custom method
    }
}

现在,只需更改 bootstrap/app.php 文件以使用自定义 class:

$app = new YOUR_NAMESPACE\ApplicationCustom(
    $_ENV['APP_BASE_PATH'] ?? dirname(__DIR__)
);

希望对您有所帮助。