验证:控制器与控制器功能

时间:2013-12-12 12:01:44

标签: php validation symfony model-view-controller

我想知道验证输入变量的最佳方法在哪里。您可以为每个框架应用此问题,但在我的情况下,它是Symfony2:控制器是一个处理单个控制器等方法的类。

E.g。我有一个Controller类,其中每个动作都是一个方法:

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在控制器操作中得到验证。但是你可以为每种操作创建一个方法。 E.g。

private function multiply( $iNum1, $iNum2 )
{
    return ( $iNum1 * $iNum2 );
}  
private function divide( $iNum1, $iNum2 )
{
    return ( $iNum1 / $iNum2 );
}

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

private function multiply( $iNum1, $iNum2 )
{
    return ( intval( $iNum1 ) * intval( $iNum2 ) );
}  
private function divide( $iNum1, $iNum2 )
{
    return ( intval( $iNum1 ) / intval( $iNum2 ) );
}

并从控制器中调用它们:

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条件和两个私函数。但是,我猜这应该是更安全的验证方式,因为你不能“忘记”验证,因为每个函数都验证自己的参数。但也意味着重复的验证。

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

2 个答案:

答案 0 :(得分:1)

我不同意“你应该验证每个函数的参数” - 在你的例子中,那些是私有函数,因此它们只由调用类调用,因此在一个干净的房间里运行:无论调用它们是什么负责处理干净的数据。因此,您的示例中的验证仅保留在适当的操作中。

也就是说,我认为验证会移动到自己的类中,并根据需要插入到表单或控制器中。我使用Zend Framework,并且我将验证器保留为服务层的一部分。 Symphony似乎执行something similar,看起来您将验证描述为模型YAML的一部分,然后在该模型上调用验证器服务。

(旁白:这似乎遵循胖模型,瘦的控制器模式,可能是rubbish。在ZF中,验证与模型是分开的。必须做更多的事情来连接碎片,但那里在模型中不那么臃肿。)

答案 1 :(得分:0)

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

相关问题