Symfony2 - 我在正确的地方处理事情吗?

时间:2015-02-22 18:11:19

标签: php symfony

我正在将标准PHP项目转变为基于Symfony2构建的东西。我有一个部分是这个功能

function viewAvailability(){

    $db = Database::get();

    $active = "Active";
    // Fetch all the active alert IDs.
    $idListSql = $db->prepare("SELECT DISTINCT id
                                FROM availability_alert
                                WHERE alert_status = :active");
    $idListSql->bindParam(':active', $active);

    $idListSql->execute();

    $alerts = array();

    // Go through each ID.
    while ($idListRow = $idListSql->fetch(PDO::FETCH_ASSOC)) {
        $alertId = (int)$idListRow["id"];

        // Create the first dimension of the array, using the alert ID as the key.
        $alerts[$alertId] = array();

        // Fetch all the availability values for this alert.
        $availabilitySql = $db->prepare("
                                SELECT availability, last_updated, class_letter, alert_pseudo, flight_number
                                FROM availability_alert_availability
                                WHERE availability_alert_id = {$alertId}
                                ORDER by class_letter, last_updated");

        $availabilitySql->execute();

        // Go through each availability result.
        while ($aRow = $availabilitySql->fetch(PDO::FETCH_ASSOC)) {
            // Fetch the date and hour for this availability row as a string.
            $dateString = new DateTime($aRow["last_updated"]);
            $dateString = $dateString->format('d M Y H:00');

            // Create the second dimension of the array, using the alert pseudo as the key.
            if (empty($alerts[$alertId][$aRow["alert_pseudo"]])) {
                $alerts[$alertId][$aRow["alert_pseudo"]] = array();
            }

            // Create the third dimension of the array, using the flight number as the key.
            if (empty($alerts[$alertId][$aRow["alert_pseudo"]][$aRow["flight_number"]])) {
                $alerts[$alertId][$aRow["alert_pseudo"]][$aRow["flight_number"]] = array();
            }

            // Create the fourth dimension of the array, using the date string as the key.
            if (empty($alerts[$alertId][$aRow["alert_pseudo"]][$aRow["flight_number"]][$dateString])) {
                $alerts[$alertId][$aRow["alert_pseudo"]][$aRow["flight_number"]][$dateString] = array();
            }
            // Create the fifth dimension of the array, using the class letter as a key, and the
            // availability value as the value.
            $alerts[$alertId][$aRow["alert_pseudo"]][$aRow["flight_number"]][$dateString][$aRow["class_letter"]] = $aRow["availability"];
        }
    }
}

这只是函数的一部分,然后我进入很多循环来输出表中的数据。无论如何,我已将上面的数据库调用移到我的实体自定义存储库中(改为使用DQL)。

然后,我在控制器中完成上述大部分工作

public function availabilityAction()
{
    $em = $this->getDoctrine()->getEntityManager();
    $alerts = $em->getRepository('NickAlertBundle:AvailabilityAlert')->getActiveAlertIds();

    $alertsArray = array();

    if (!$alerts) {
        throw $this->createNotFoundException('Unable to find Availability.');
    }

    foreach($alerts as $alert){
        $alertId = (int)$alert['id'];
        $alertsArray[$alertId] = array();
        $allAvailability = $em->getRepository('NickAlertBundle:AvailabilityAlert')->getAlertAvailability($alertId);

        foreach($allAvailability as $alertAvailability)
        {
            $dateString = $alertAvailability['lastUpdated'];
            $dateString = $dateString->format('d M Y H:00');

            if (empty($alerts[$alertId][$alertAvailability['alertPseudo']])) {
                $alertsArray[$alertId][$alertAvailability['alertPseudo']] = array();
            }

            if (empty($alerts[$alertId][$alertAvailability['alertPseudo']][$alertAvailability['flightNumber']])) {
                $alertsArray[$alertId][$alertAvailability['alertPseudo']][$alertAvailability['flightNumber']] = array();
            }

            if (empty($alerts[$alertId][$alertAvailability['alertPseudo']][$alertAvailability['flightNumber']][$dateString])) {
                $alertsArray[$alertId][$alertAvailability['alertPseudo']][$alertAvailability['flightNumber']][$dateString] = array();
            }

            $alertsArray[$alertId][$alertAvailability['alertPseudo']][$alertAvailability['flightNumber']][$dateString][$alertAvailability['classLetter']] = $alertAvailability['availability'];
        }
    }

    return $this->render('NickAlertBundle:Page:availability.html.twig', array(
        'alertsArray' => $alertsArray,
    ));
}

现在它很整洁,但我觉得我的控制器中有太多的东西(不确定这是否好)。另一个问题是我正在将这个已填充的数组传递给我。现在我有一个复杂的表格布局来创建这个数组,我真的不认为它应该是视图的工作来做到这一点。例如,这是我需要在视图中转换的代码的一部分

 if (!empty($pseudos)) {
    foreach ($pseudos as $pseudo => $flights) {
        foreach ($flights as $flight => $dates) {
            $firstDate = array_pop(array_keys($dates));

            echo '<div class="availability_table_container">';

            echo "<table class='availability_table'>";
            echo "<tr>";
            if ($i == 0) {
                echo "<th></th>";
            }
            echo "<th class='pseudo-header'>{$flight}</th>";
            echo "</tr>";
            echo "<tr>";
            foreach (array_keys($dates[$firstDate]) as $classLetter) {
                if ($j == 0) {
                    echo "<th></th>";
                }
                $j++;
                echo "<th class='class-header'>{$classLetter}</th>";
            }
            echo "</tr>";
            foreach ($dates as $date => $classes) {
                echo "<tr>";
                if ($i == 0) {
                    echo "<td class='time_row'>{$date}</td>";
                }
                foreach ($classes as $classLetter => $availability) {
                    if ($availability >= 0) {
                        $className = $availability > 0 ? "green" : "red";
                    }
                    if ($availability == "." || $availability == "-") {
                        $className = "purple";
                    }

                    echo "<td class='number_row {$className}'>{$availability}</td>";
                }
                echo "</tr>";
            }
            $i++;
            echo "</table>";
            echo "</div>";
        }
    }
}

那么处理这段代码的最佳方法是什么?我认为我不允许我的视图处理上面的代码是正确的,但那我应该在哪里做呢?

对设计的任何建议表示赞赏。

0 个答案:

没有答案