【问题标题】:How to override the resourcePath() function defined in Illuminate/Foundation/Application.php如何覆盖 Illuminate/Foundation/Application.php 中定义的 resourcePath() 函数
【发布时间】:2020-01-25 15:15:09
【问题描述】:

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

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

【问题讨论】:

    标签: laravel overriding laravel-6 modularization


    【解决方案1】:

    创建一个扩展 \Illuminate\Foundation\Application 的新 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__)
    );
    
    

    希望对你有帮助。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-23
        • 2014-04-17
        • 2022-01-06
        • 2018-06-25
        相关资源
        最近更新 更多