【问题标题】:How can I wrap PHP legacy code in Kohana?如何在 Kohana 中包装 PHP 遗留代码?
【发布时间】:2011-07-12 15:48:54
【问题描述】:

我有大量用 PHP 编写的遗留代码,这些代码不是在任何特定框架上编写的,而是主要是老式风格(即内联)PHP。但是,我的大部分新代码都是在 Kohana 3.1.X 框架上编写的。尽管 Kohana 确实允许遗留代码和 Kohana 文件在同一个网站上共存,但我现在想将每个遗留代码文件包装为一个视图,并充分利用 Kohana 的 MVC 设计模式和 URL 重写。然而,我遇到的问题是我的遗留代码无法访问从视图本身(即遗留代码)中定义的全局变量,并且无法利用试图通过全局范围语句查看这些全局变量的内联函数。例如:

application/views/legacy.php

$gvar = 5;

function getadminsettings(){
    global $gvar;
    echo $gvar;
}

应用程序/类/控制器/myctrl.php

...
public function action_legacy() {
    // call legacy.php as a view via View::factory()
}
...

由于我有这么多遗留代码,将所有这些遗留代码文件重构为真实视图是不切实际的。我如何将这些文件视为视图或像访问它们一样访问它们,以便我可以从现在开始在控制器中编写我的逻辑而不是内联(因此,遵循真正的 MVC 设计模式)然后绑定变量到这些旧文件?

我确实看过In PHP, how can I wrap procedural code in a class?,但这篇文章在这种情况下并不适用,因为我正在处理 Kohana 框架。

更新:

Kohana 似乎正在使用输出缓冲区,这就是它无法访问旧文件中的此类全局变量的原因。有没有人成功地在 Kohana 3.2 中获取访问全局变量的视图?

【问题讨论】:

    标签: php model-view-controller kohana-3


    【解决方案1】:

    将遗留应用程序迁移到 MVC 风格的框架不适合采用剪切粘贴方法。在除最简单的应用程序之外的任何应用程序中,都需要大量时间和精力来重构代码以使其与 MVC 兼容。

    如果您的遗留应用程序可以正常工作并且没有进行常规开发,那么切换到 MVC 将不会有什么好处。 MVC 模式通常会引入开销,主要是对开发人员而非最终用户有利。

    但是,如果您的应用程序需要定期维护,您将不得不花费所需的精力来重构旧代码以适应新方法。

    【讨论】:

    • 是的,我希望遗留代码将继续定期维护,但我想限制遗留代码库的更改次数。
    • @Matthew:在这种情况下,我认为需要进行全面的重构。包装现有代码的尝试充其量是脆弱的,最坏的情况是难以维护。
    • 我一直在探索使用 cURL 调用来访问这些脚本的想法,方法是创建一个特殊的类来做而不是使用 View::factory() 方法,但我不想添加更多加载到服务器上。你认为这可行吗?
    • 如果您的旧脚本以对您有用的格式输出数据,那么它将起作用。脆弱性和可维护性差仍然会存在,但利弊由您自己权衡。
    【解决方案2】:

    我从未尝试过,但您可以尝试将代码放入控制器,而不是视图。

    假设您在此处为控制器使用 Controller_Template

    public function action_legacy() {
        $this->auto_render = FALSE;
    
        include('legacy file'); 
        // you could cut and paste the legacy code here, but it might get to messy
    }
    

    【讨论】:

      猜你喜欢
      • 2015-04-11
      • 1970-01-01
      • 1970-01-01
      • 2023-03-23
      • 2010-11-18
      • 2017-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多