0

我正在模块化 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);

但我认为可以安全地假设手动更改供应商文件夹下的任何内容是非常愚蠢的。显然我需要在某个地方覆盖这个函数。我不清楚在哪里以及如何做到这一点

4

2 回答 2

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__)
);

希望能帮助到你。

于 2019-09-25T13:06:01.957 回答
1

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

于 2019-09-25T12:36:05.893 回答