如何覆盖 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__)
);
希望对您有所帮助。
我正在模块化 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__)
);
希望对您有所帮助。