0

我冒险进入 Zend 框架并决定构建一个简单的应用程序来练习。我正在构建的应用程序是一个简单的计算器,它允许用户对两个数字进行加减乘除。

我无法检索用户输入来计算答案。当我Zend_Debug::dump($this->getRequest()->getParams());在该IndexAction()方法中使用时,它会在页面上正确显示表单数据,但是如何将数据发送到正确的模型进行处理?

这是IndexController.php文件:

<?php

class IndexController extends Zend_Controller_Action
{

    //initialize calculator form on controller call
    public function init()
    {

        //istantiate Zend_Form object
        $form = new Zend_Form();
        $form->setAction('')
             ->setMethod('post');


        //first number input
        $num1 = $form->createElement('text', 'num1');
        $num1->addValidator('Digits')
             ->setRequired(true)
             ->setAttrib('placeholder', 'Enter First Number');

        //second number input    
        $num2 = $form->createElement('text', 'num2');
        $num2->addValidator('Digits')
             ->setRequired(true)
             ->setAttrib('placeholder', 'Enter Second Number');

        //math operator select box
        $op = $form->createElement('select', 'operator');
        $op->setRequired(true)
              ->setMultiOptions(array('1'=>'+', '2'=>'-', '3'=>'X', '4'=>'/'))
              ->setRequired(true);

        //add elements to form
        $form->addElement($num1)
             ->addElement($op)           
             ->addElement($num2)
             ->addElement('submit', 'equal', array('label' => '='));

        return $form;
    }

    public function indexAction()
    {
        //render the form view
        $this->view->form = $this->init();
        $this->render('index');

    }


    public function calcAction()
    {

        $form = $this->form;
        $data = $this->getRequest()->getParams();

        if ($data->isPost()) {

            if($data->isValid()) {

                $calculator = new Calculator_Model;

                switch($data['operator']) {
                    case $data['operator'] === '1':
                       $ans = $calculator->addNums($data['num1'], $data['num2']);
                       return $ans;
                       break;
                    case $data['operator'] === '2':
                        $ans = $calculator->subtractNums($data['num1'], $data['num2']);
                        return $ans;
                        break;
                    case $data['operator'] === '3':
                        $ans = $calculator->multiplyNums($data['num1'], $data['num2']);
                        return $ans;
                        break;
                    case $data['operator'] === '4':
                        $ans = $calculator->divideNums($data['num1'], $data['num2']);
                        return $ans;
                        break;
                }

            } else {
                return $form->getMessages();
            }
        } 
    }

}

我尝试将calcAction()脚本放入indexAction()方法中,但页面根本不呈现。如何让用户输入Calculator_Model进行处理?

4

2 回答 2

1

我想你做的大部分事情都是正确的,但我个人认为你不应该在控制器中做太多的编程。您的控制器不仅将数据传递给模型,它实际上还试图找出要调用的函数。

这应该由模型完成。问题很简单,解决方案也很简单,但这不会是可扩展的。考虑到您希望添加一个操作,您必须在模型中创建它的函数并在控制器中添加一个案例。

我通常做的是

检查表格是否有效:$form->isValid()

实例化模型:$cal = new Model()

将数据传递给模型:$calc->process($form->getValues())

process() 将是我模型中唯一的公共方法。switch case 语句将进入该方法并调用适当的受保护方法。我也会让模型决定表单中运算符元素的选项 $op->setMultiOptions(Model::$availableOperations) 这样我就可以在需要添加操作时更新我的​​模型。

我希望这一切对某人有意义。:)

于 2013-04-19T11:37:21.643 回答
0

我找到了解决这个问题的方法。

我改为$data = $this->getRequest()->getParams();$data = $this->getRequest()->getPost();开始正确获取数据。我不知道是什么阻止了数据通过,getParams();但我发现getParams();它不能使用该Zend_Filter();函数验证数据,getPost();但是可以。

计算器应用程序现在完成的代码与此处粘贴的代码完全不同。您可以在以下位置查看最终产品:https ://github.com/TylerB24890/Zend-Calculator

在我的最终应用程序中,我必须为数字输入创建一个单独的验证器类,以允许整数和浮点数。我没有将这些分配给该Zend_Filter()功能,因为我无法使它们正常工作。如果有人对如何使这些工作有任何提示,请通过上面的链接为 GitHub 项目做出贡献。

于 2013-04-22T16:42:22.193 回答