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

时间:2019-09-25 12:18:20

标签: laravel overriding laravel-6 modularization

我正在模块化laravel。我决定将所有默认路由,控制器,资源等移至/ app / Modules / Pub。在大多数情况下,它运行良好。但是,我想更改应用程序的默认资源路径。不幸的是,这似乎不是(轻松)可配置的。

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

我认为有可能在某处覆盖此功能,但这似乎是一个不合标准的技巧,因为该功能仅由以下组成:

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文件夹下的任何内容都是很愚蠢的。显然,我需要在某个地方重写此功能。我不清楚在哪里以及如何做

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

创建一个新的Application类来扩展\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文件更改为使用自定义类:

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

希望有帮助。