Php 将(不纯)遗留功能纳入Symfony控制器范围 遗留项目

Php 将(不纯)遗留功能纳入Symfony控制器范围 遗留项目,php,symfony,scope,legacy-code,Php,Symfony,Scope,Legacy Code,我正在重写一个遗留PHP应用程序以使用Symfony。前者在lib中有大约400个函数,这些函数都位于全局范围内。项目结构(以非常简化的方式)如下所示: 所有函数目前都包含在文件中,它们由lib/functions.php的单个include使用,该include又包含lib中的所有其他文件 #index.php 我可能误解了这个问题,但我认为你把事情弄得比实际情况更复杂了。Symfony应用程序有两个主要入口点:public/index.php和bin/console。您真正需要做的就是将fu

我正在重写一个遗留PHP应用程序以使用Symfony。前者在
lib
中有大约400个函数,这些函数都位于全局范围内。项目结构(以非常简化的方式)如下所示:

所有函数目前都包含在文件中,它们由
lib/functions.php
的单个include使用,该include又包含
lib
中的所有其他文件

#index.php

我可能误解了这个问题,但我认为你把事情弄得比实际情况更复杂了。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

一切似乎都如期进行。问候语函数在lib/greeting.php中定义,并使用全局$config。functions.php加载config.php和greeting.php。

让依赖于
$config
$db\u handle
的函数与环境变量一起工作,然后使用
files
属性来加载遗留代码可能是值得的。但我不明白为什么全局变量在这种情况下不起作用?我想,重写
$config
$GLOBALS[“config”]
等都会起作用。这就是你的意思吗?谢谢!这当然是我没有想到的一种可能性。让我有点担心的是,不管最终调用什么控制器,将函数引入作用域的开销(可能不可忽略)(当然,在使用
composer.json的
文件
属性时也是如此)。将有很多对应用程序的请求(大部分是REST端点上的CRUD)根本不需要旧函数。因此,一开始,有选择地向进口商注入依赖性似乎是个好主意。但也许阅读/解析500KB以上的PHP代码没什么好担心的……PHP7在缓存这类内容方面做得非常好。在分析显示这是一个真正的问题之前,我不会担心它。如果真的只有特定的控制器需要访问这些函数,那么我个人认为只在需要时包含函数文件没有问题。如果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
class MyCommand extends Command
{
    protected static $defaultName = 'app:hello';

    protected function execute(InputInterface $input, OutputInterface $output)
    {
        $output->writeln(greeting());
    }
}