为Git拉伸配置.php
我的公司几年前曾为一个Web应用程序工作,这个应用程序基本上是Joomla 2.5核心的扩展。我们从另一家陷入困境的开发公司接管了这个应用程序(我们永远不会修改核心。)它被部署到AWS,原始开发人员修改了配置.php文件,使其根据亚马逊云服务器设置的环境变量返回不同的值。当我看到这一点时,我想,“肯定有更好的方法。”
如今,开发人员将应用程序部署到几个不同的环境,并使用Git共享源代码副本是很常见的。确保配置.php文件始终被每个人忽略,并为不同的环境设置特定的配置.php文件(例如,“测试”,“本地”,“生产”)可能是一件头疼的事情。
幸运的是,Joomla 3足够灵活,使得使用多个配置.php文件相对容易。在本文中,我将向您展示如何解放您的配置.php文件,创建多个副本,这样您就不必在这个问题上纠缠。最好的是,不需要更改核心。
免责声明:尽管我们没有更改核心,但我们正在走上一条新路,所以这是一篇专门针对理解这些更改及其对应用程序影响的开发人员的文章。
重新布线Joomla定义
随着Joomla应用程序的加载,它会寻找一个在Web根目录中不存在的文件,名为defines.php。当它找不到时,它会从includes文件夹加载自己的。
defines.php文件用于设置环境的一些常量,包括库文件夹、管理员文件夹和模板文件夹的路径。对于我们的情况特别有用的是,它设置了配置.php文件的路径。
我们将利用这一点,通过创建自己的 defines.php 文件并设置自定义配置路径来实现。然而,我们不会仅仅将配置文件移动到其他位置,而是将使用一个“位置”类来检查文件路径,并使用该路径来确定要加载的特定配置文件。
我们为什么要这样做呢?
当一个开发者在工作站上加载他们的网站版本时,我们的类将匹配他们的本地目录到他们本地数据库的特定配置文件。无需更改任何文件,当相同的代码集部署到服务器上的某个地方的预发布目录时,该类将匹配那里的目录结构到预发布数据库。最后,当我们将它加载到生产环境时,它将识别该架构并加载那里的匹配配置.php 文件。我们不仅可以匹配特定数据库凭据到他们的环境,还可以调整其他配置变量以优化在这些环境中的工作(在生产环境中启用缓存,但在开发环境中不启用,在生产环境中使用真实邮件发送器,但在开发环境中使用模拟邮件发送器等)。
这种方法的另一个好处是,我们可以为每个项目使用通用的 .gitignore 模板,而无需担心配置.php 在分支中被添加或修改(值得注意的是,将敏感信息如数据库凭据包含在版本控制中存在安全考虑)。
让我们开始吧!
以下是实际操作中的样子
#1 在网站根目录和管理员目录中添加自定义 Defines.php
以下是自定义 defines.php 的上半部分摘录。注意位置类及其返回值是如何用于加载配置.php 的特定目录的。
defined('_JEXEC') or die;
define('JPATH_BASE', __DIR__);
// 全局定义
$parts = explode(DIRECTORY_SEPARATOR, JPATH_BASE);
// 映射到配置文件夹中的自定义配置文件:本地、生产、预发布
require_once(JPATH_BASE .'/configurations/location.php');
$location = ConfigurationLocation::getLocation();
define('_JDEFINES', true);
// 定义。
define('JPATH_ROOT', implode(DIRECTORY_SEPARATOR, $parts));
define('JPATH_SITE', JPATH_ROOT);
define('JPATH_CONFIGURATION', JPATH_ROOT . '/configurations/' . $location);
我们还需要对管理员文件夹做同样的处理,以便应用程序也能在那里加载。为此,我们向该文件夹添加一个自定义的 defines.php。在这个自定义的 defines.php 文件中,唯一的不同之处在于确保其中的路径指向正确的定义和我们的位置类(由于位置的不同,略微有所不同)。
#2 使用“配置位置”类匹配环境的路径到特定目录
每个都将包含独特的配置.php 文件(注:我们可以重构和清理位置类,但现在它是简单的,而且目前有效。)
class ConfigurationLocation
{
CONST PRODUCTION_DIR = '/home/production';
CONST STAGING_DIR = '/home/staging';
CONST JOHN_DIR = '/home/john/';
CONST SARA_DIR = '/var/www/project1';
CONST PRODUCTION = 'production';
CONST JOHN = 'john';
CONST STAGING = 'staging';
CONST SARA = 'sara';
static public function getLocation()
{
$location = new ConfigurationLocation();
$homeDir = $location->_getHomeDir();
return $location->_searchConfigurations($homeDir);
}
protected function _getHomeDir()
{
$home = $this->_getHomeDirFromDocumentRoot();
return ($home) ? $home : getcwd();
}
protected function _getHomeDirFromDocumentRoot()
{
return ($_SERVER['DOCUMENT_ROOT'] !== '') ? $_SERVER['DOCUMENT_ROOT'] : false;
}
protected function _searchConfigurations($dir)
{
if ($this->_containsDirectory($dir, static::PRODUCTION_DIR)) return static::PRODUCTION;
elseif ($this->_containsDirectory($dir, static::STAGING_DIR)) return static::STAGING;
如果当前实例包含目录($dir, static::JOHN_DIR),则返回 static::JOHN;
如果当前实例包含目录($dir, static::SARA_DIR),则返回 static::SARA;
返回 static::PRODUCTION;
}
受保护函数 _containsDirectory($search, $dirConstant)
{
返回 (strpos($search, $dirConstant) !== false);
}
}
将“配置”目录添加到每个 Configuration.php 以便管理
示例文件
如果您想快速开始使用此方法的项目,您可以在以下位置获取一个示例自定义 defines.php 文件和位置类:
Joomla 是 Limbo 王后
这是 Joomla 架构灵活性的一个例子,能够重新定义核心路径,从而打开其他选项:将配置文件和库移动到 Web 根目录之上,重命名管理员或模板文件夹以提高安全性,运行多个网站以共用核心,等等。结合懒加载、模板覆盖、HMVC 组件、基于事件的插件、模块和可扩展性,您将拥有一个强大的工具,用于制作各种解决方案。作为一个开发者,这让我感到无比感激。
感谢 Joomla 核心团队!
一些在 Joomla 社区杂志上发表的文章代表了作者在特定主题上的个人观点或经验,可能并不与 Joomla 项目官方立场一致
通过接受,您将访问 https://magazine.joomla.net.cn/ 外部的第三方服务
评论