【问题标题】:Opinion needed from a PHP Technical Architect需要 PHP 技术架构师的意见
【发布时间】:2010-11-20 03:37:32
【问题描述】:

请看下面的代码。

require_once("initvars.inc.php");
require_once("config.inc.php");

?>
<?php
if($latestads_count)
{
?>


<div class="latestposts">

<div class="head"><?php echo $lang['LATEST_ADS']; ?></div>


<table border="0" cellspacing="0" cellpadding="0"  class="postlisting" width="100%">


<?php
$sql = "SELECT a.*, ct.cityname, UNIX_TIMESTAMP(a.createdon) AS timestamp, feat.adid      AS isfeat,
            COUNT(*) AS piccount, p.picfile AS picfile, scat.subcatname, scat.catid, cat.catname
        FROM $t_ads a
            INNER JOIN $t_cities ct ON a.cityid = ct.cityid
            INNER JOIN $t_subcats scat ON a.subcatid = scat.subcatid
            INNER JOIN $t_cats cat ON scat.catid = cat.catid
            LEFT OUTER JOIN $t_featured feat ON a.adid = feat.adid AND feat.adtype = 'A' AND feat.featuredtill >= NOW()
            LEFT OUTER JOIN $t_adpics p ON a.adid = p.adid AND p.isevent = '0'
        WHERE $visibility_condn
            $loc_condn
        GROUP BY a.adid
        ORDER BY a.createdon DESC
        LIMIT $latestads_count";
$res_latest = mysql_query($sql) or die($sql.mysql_error());

$css_first = "_first";
while($row = mysql_fetch_array($res_latest))
{

    $url = buildURL("showad", array($xcityid, $row['catid'], $row['catname'], 
        $row['subcatid'], $row['subcatname'], $row['adid'], $row['adtitle']));


?>

    <?php 
    if($row['isfeat'])
    {
        //$feat_class = "class=\"featured\"";
        $feat_img = "<img src=\"images/featured.gif\" align=\"absmiddle\">";
    } 
    else 
    { 
        //$feat_class = "";
        $feat_img = "";
    }

    if($row['picfile']) 
    {
        $picfile = $row['picfile'];
        $imgsize = GetThumbnailSize("{$datadir[adpics]}/{$picfile}", $tinythumb_max_width, $tinythumb_max_height);
    }
    else 
    {
        $picfile = "";
    }
    ?>

    <tr>
        <td width="15">
        <img src="images/bullet.gif" align="absmiddle">
        </td>

        <td>
        <b><a href="<?php echo $url; ?>" <?php echo $feat_class; ?>><?php echo $row['adtitle']; ?></a></b> 
        <?php if(0&&$row['picfile']) { ?><img src="images/adwithpic.gif" align="absmiddle"><?php } ?>
        <?php echo $feat_img; ?><br>


        <span class="adcat">



        <?php echo "$row[catname] $path_sep $row[subcatname]"; ?>



        <?php 
        $loc = "";
        if($row['area']) $loc = $row['area'];
        if($xcityid < 0) $loc .= ($loc ? ", " : "") . $row['cityname'];
        if($loc) echo "<br>$loc";
        ?>             

        </span>



        </td>

        <td  align="right" width="<?php echo $tinythumb_max_width; ?>">
        <?php if($picfile) { ?>
        <a href="<?php echo $url; ?>"><img src="<?php echo "{$datadir[adpics]}/{$picfile}"; ?>" border="0" width="<?php echo $imgsize[0]; ?>" height="<?php echo $imgsize[1]; ?>" style="border:1px solid black"></a>
        <?php } ?>
        </td>

    </tr>

这是来自现有项目的代码文件之一。如你所见,它有html、sql、php混合在一起......显然很难维护。

此应用程序中大约有 55 个大小和类型相似的文件。

我想重构这段代码,下面是我这样做的目标:

1)易于维护。

2)能够通过添加附加功能轻松扩展。

3)能够将此代码重用于不同但有些相似的应用程序。

基于以上事实,我有几个问题:

1) 你认为我们可以将这段代码重构为 mvc 应用程序吗?

2) 如果可以的话。例如,对于专家级程序员来说,重构整个项目(55 个文件)需要多少时间?

3)我应该重用上面的代码,还是应该从头开始使用现有的 mvc 框架?

4)如果我们使用现有的 mvc 框架,比如 symfony、zend 等,我们需要多少时间来完成整个项目?

5)据我所知,到目前为止,该站点仅运行 Mysql(因为当前数据库是在 mysql 中完成的)。我们是否应该允许模型中的数据抽象/数据访问层(假设有一些性能比 Mysql 更好,我不确定)

7) 我们是否可以轻松地重构代码以包含模型(数据抽象/访问)、视图(更多模板、视图逻辑等)、控制器等的子层,以防我们将来想要这样做或会这样做我们需要从头开始吗?

8) mvc 是要走的路,还是有比它更好的模式/方式(假设该网站面向数十万用户)?

【问题讨论】:

    标签: php model-view-controller architecture


    【解决方案1】:
    1. 是的。
    2. 我会说每个这种大小的文件大约需要一个小时,以确保一切顺利。所以需要 1-2 周的扎实工作。
    3. 如果效果良好,只需重新分解即可。如果您真的想要新的东西,请使用框架。
    4. 现有框架复制现有功能可能需要更长的时间(可能需要一个月)。但是,从长远来看,您将拥有一个更稳定的应用程序(很可能)。
    5. MySQL 没有任何问题。如果您觉得将来出于其他原因想要切换,请使用数据抽象层。
    6. 没有理由不能重构。我最近做了这个,这并不难。
    7. MVC 非常理想。也就是说,有很多不同的方法来做 MVC。有些好,有些更好,有些很糟糕。

    【讨论】:

    • 伟大的杰夫,这就是我一直在寻找的信息/答案......希望其他人也能分享他们的经验。
    • 嗨,杰夫,谢谢......我想问你另一个问题......我想我会接受你的回答,同时将你指向我希望你的下一个问题回答......但我想我会保留下一次。 :)
    【解决方案2】:

    我认为没有像“mvc 应用程序”这样的东西,但是 mvc 模式当然可以在这个应用程序中使用。您可以构建一些数据类来封装各种查询并将结果转换为一个对象或对象数组。控制器类可以获取这些结果并对其进行处理,然后将处理后的数据提供给特定模板。这是一个类似 mvc 的结构,非常容易维护。我也会建立一些帮助类。您不想到处调用 mysql_query,因为明年您可能需要使用 mysqli,甚至可能需要使用完全不同的数据库。

    所以,是的,使用 mvc 模式,但不仅如此。重构整个代码。尽可能使用现成的库(例如用于数据库抽象),并在开始构建之前花费大量时间思考正确的方法。

    【讨论】:

    • 是的,我理解这种哲学......我不确定你是在一般评论还是有任何与我的代码特别相关的内容(例如,你是否要求我封装现有的 sql /在我的代码中查询到数据类或要求我从头开始编写新的数据类)?
    • 不要过度...也就是说-不要丢弃可以很好使用的东西-例如,您可以将在整个项目中多次使用的代码放入类中的函数(不要更改它),并用调用类的方法替换原始代码的每个实例。然后你可以在类方法中做一个改变,它不会要求你在任何地方都这样做。此外,请注意保留哪些代码,哪些不保留。您的代码包含在非常旧的代码上,而一切都在正常工作的情况经常发生。
    • 是的,我查看了您的代码。它看起来很像我为自己的网站编写的代码。我将该代码重写为基本上 4 个不同的层。 1. 可以执行参数化查询并将结果返回到二维数组的数据库类, 2. 封装网站特定查询的查询类(使用数据库类)。 3. 一个模板类,它获取数据并放入模板(模板 = 只输出变量和 html 的哑 php)和 4. 包含将它们放在一起的逻辑的类。现在这只是一个爱好网站,但它可能对你来说也足够了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-08
    • 1970-01-01
    • 2011-10-03
    • 1970-01-01
    • 1970-01-01
    • 2011-01-10
    相关资源
    最近更新 更多