在Symfony控制器的范围内带来(不纯的)遗留函数

问题描述 投票:1回答:1

旧项目

我正在重写旧版PHP应用程序以使用Symfony。前者的核心是lib中的约400个功能,所有功能都位于全球范围内。项目结构看起来(以非常简化的方式)如下:

├── index.php
├── lib
│   ├── lib_foo.php
│   ├── lib_bar.php
│   └── functions.php
└── config
    └── config.php

当前所有功能都包含在文件中,这些文件由lib/functions.php的单个包含使用,这些文件又包含lib中的所有其他文件。

# index.php
<?php
include_once("lib/functions.php");

echo greeting();
echo visitorCount();
# lib/functions.php
<?php
include_once("../config/config.php");
include_once("lib_foo.php");
include_once("lib_bar.php");
...
// a lot more includes to follow

$db_handle = mysqli_connect(
    $config["db_host"], 
    $config["db_user"], 
    $config["db_pass"]
);

虽然lib中的功能不是纯函数,但是可以访问全局配置数组$config(在config/config.php中定义)和共享数据库连接$db_handle(在functions.php中定义)。

# lib/lib_foo.php
<?php

function greeting() 
{
    // We are reading from a global config array here
    global $config;

    return "Welcome to " . $config["sitename"];
}


function visitorCount() 
{
    // We are using a global database handle defined in functions.php here
    global $db_handle;

    return mysqli_query($db_handle, "SELECT `visitor_count` FROM `visitors`");    
}

在新的Symfony应用程序中,除了lib中的功能外,几乎所有东西都被重写了(目前太费力了……)。这些功能需要使新的Symfony控制器可以访问。由于旧应用程序是同时扩展的,因此一个目标是通过尽可能少的修改来重用lib中的代码。

我尝试/想要的东西

那么,如何将这些功能纳入Symfony的范围?我最初试图:

  • filescomposer.json属性中指定各个文件
  • 创建一个Symfony服务OldFunctionsService,将文件包含在其构造函数中,然后将服务依赖注入到控制器中,我需要在作用域中使用旧功能。

但是,这两种方法均不适用于使用全局$config$db_handle变量的函数。它们仅将两个变量带入各自的导入功能/构造函数的功能范围,而不带入最终调用旧功能的控制器功能的全局范围/作用域。

那么,在不使用(相当丑陋和不灵活)的情况下将旧功能纳入范围的我有哪些选择呢?>

require_once("config/config.php");
require_once("lib/functions.php");

在每个控制器中?这似乎也有总是创建新数据库连接的缺点,这不是我想要的。

我想$config可以重构为具有静态属性的类,而$db_handle可以重构为具有静态方法getConnection的类,该方法将始终返回相同的连接对象(单例),但需要进行大量更改遗留应用程序中的代码数量不理想...

有什么想法吗?

遗留项目,我正在重写遗留PHP应用程序以使用Symfony。前者的核心是lib中的约400个功能,这些功能都生活在全球范围内。项目结构看起来(非常...

php symfony scope legacy-code
1个回答
0
投票

我可能会误解这个问题,但我认为您正在使这一过程变得比实际复杂。 Symfony应用程序有两个主要入口点:public / index.php和bin / console。您真正需要做的就是在这两个文件中包含functions.php

# bin/console
#!/usr/bin/env php
<?php

use App\Kernel;
use Symfony\Bundle\FrameworkBundle\Console\Application;
use Symfony\Component\Console\Input\ArgvInput;
use Symfony\Component\Debug\Debug;

if (false === in_array(\PHP_SAPI, ['cli', 'phpdbg', 'embed'], true)) {
    echo 'Warning: The console should be invoked via the CLI version of PHP, not the '.\PHP_SAPI.' SAPI'.\PHP_EOL;
}

set_time_limit(0);

require dirname(__DIR__).'/vendor/autoload.php';
require dirname(__DIR__).'/lib/functions.php'; // *** Just add this
© www.soinside.com 2019 - 2024. All rights reserved.