我正在冒险进入Zend Framework并决定构建一个简单的应用程序来实践。我正在构建的应用程序是一个简单的计算器,允许用户添加,减去,乘以和除以两个数字。
我无法检索用户输入来计算答案。当我在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
进行处理?
答案 0 :(得分:1)
我猜你正在做大部分事情,但我个人认为你不应该在控制器中做那么多的编程。你的控制器不仅将数据传递给模型,它实际上试图找出要调用的函数。
这应该是由模型完成的。问题很简单,解决方案也是如此,但这不可扩展。考虑到您希望添加操作,您必须在模型中创建它的功能,并在控制器中添加一个案例。
我通常做的是
检查表单是否有效:$form->isValid()
实例化模型:$cal = new Model()
将数据传递给模型:$calc->process($form->getValues())
process()将是我模型中唯一的公共方法。 switch case语句将进入该方法并调用适当的受保护方法。
我也会让模型决定表单中operator元素的选项
$op->setMultiOptions(Model::$availableOperations)
这样,只要我需要添加操作,我就可以更新我的模型。
我希望这一切对某人有意义。 :)
答案 1 :(得分:0)
我找到了解决这个问题的方法。
我将$data = $this->getRequest()->getParams();
更改为$data = $this->getRequest()->getPost();
,我开始正确获取数据。我不知道是什么阻止数据通过getParams();
传出,但我发现getParams();
不使用Zend_Filter();
函数验证数据,getPost();
但是。
计算器应用程序现在完成的代码与此处粘贴的代码完全不同。您可以在https://github.com/TylerB24890/Zend-Calculator
查看最终产品在我的最终应用程序中,我必须为数字输入创建一个单独的验证器类,以允许整数和浮点数。我没有将这些内容分配给Zend_Filter()
函数,因为我无法正确地使用这些函数。如果有人有关于如何进行这些工作的任何提示,请在上面的链接中为GitHub项目做出贡献。