首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >验证:控制器与控制器函数

验证:控制器与控制器函数
EN

Stack Overflow用户
提问于 2013-12-12 12:01:43
回答 2查看 101关注 0票数 0

我想知道验证输入变量的最佳方法是什么。您可以为每个框架应用这个问题,但在我的例子中,它是Symfony2:控制器是一个类,它处理像单个控制器这样的方法。

例如,我有一个Controller类,其中每个动作都是一个方法:

代码语言:javascript
复制
namespace MSD\HomeBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use MSD\HomeBundle\Entity\Imagen as Imagen;

class HomeController extends Controller
{   
    public function indexAction()
    {
        if( isset( $_POST['whatever'] ) && $whatever = intval( $_POST['whatever'] ) )
        {
           $iFoo1 = $whatever * 25;
           $iFoo2 = $whatever / 32;

           return $this->render( 'MSDHomeBundle:Home:template.html.twig', array( 'foo'=> array( 'foo1'=>$iFoo1, 'foo2'=>$iFoo2 ) ) );
        }
    }
    //...
}    

$whatever在控制器动作中被验证。但是您可以为每种操作创建一个方法。例如。

代码语言:javascript
复制
private function multiply( $iNum1, $iNum2 )
{
    return ( $iNum1 * $iNum2 );
}  
private function divide( $iNum1, $iNum2 )
{
    return ( $iNum1 / $iNum2 );
}

您应该验证每个函数的参数:

代码语言:javascript
复制
private function multiply( $iNum1, $iNum2 )
{
    return ( intval( $iNum1 ) * intval( $iNum2 ) );
}  
private function divide( $iNum1, $iNum2 )
{
    return ( intval( $iNum1 ) / intval( $iNum2 ) );
}

从控制器打电话给他们:

代码语言:javascript
复制
namespace MSD\HomeBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use MSD\HomeBundle\Entity\Imagen as Imagen;

class HomeController extends Controller
{   
    public function indexAction()
    {
        if( isset( $_POST['whatever'] ) && $whatever = intval( $_POST['whatever'] ) )
        {
           $iFoo1 = $this -> multiply( $whatever, 25 );
           $iFoo2 = $this -> divide( $whatever / 32 );

           return $this->render( 'MSDHomeBundle:Home:template.html.twig', array( 'foo'=> array( 'foo1'=>$iFoo1, 'foo2'=>$iFoo2 ) ) );
        }  
    }
    //...
}    

但是,您将对$_POST['whatever']进行三次验证:在if条件下和在两个私有函数中。但是,我猜这应该是更安全的验证方法,因为您不能“忘记”验证,因为每个函数都验证它们自己的参数。但也意味着重复验证。

我不确定是否有更好的方法继续下去。我无法找到更好的解决方案,在不重复验证的情况下保持最大安全性。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-12-12 12:59:24

我不同意“您应该验证每个函数的参数”--在您的示例中,这些是私有函数,因此它们只被调用类调用,因此在一个干净的房间中操作:不管调用它们是什么,都负责处理干净的数据。因此,您的示例中的验证只保留在操作本身中。

尽管如此,我相信验证会转移到它自己的类中,并根据需要插入表单或控制器。我使用Zend,并将验证器保留为服务层的一部分。Symfony似乎在执行类似的东西,在这里,您将验证描述为YAML模型的一部分,然后调用该模型上的验证器服务。

(旁白:这似乎遵循脂肪模型,瘦身控制器模式,这可能是垃圾。在ZF中,验证与模型是分开的。需要做更多的工作来连接各个部分,但模型中的浮肿较少。)

票数 1
EN

Stack Overflow用户

发布于 2013-12-12 12:48:26

最合适的方法是为此创建自己的验证器。我不喜欢这种验证方式--将来您的控制器将被不必要的代码重载:P最好像symfony教程中那样做。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20542989

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档