我想知道验证输入变量的最佳方法是什么。您可以为每个框架应用这个问题,但在我的例子中,它是Symfony2:控制器是一个类,它处理像单个控制器这样的方法。
例如,我有一个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在控制器动作中被验证。但是您可以为每种操作创建一个方法。例如。
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条件下和在两个私有函数中。但是,我猜这应该是更安全的验证方法,因为您不能“忘记”验证,因为每个函数都验证它们自己的参数。但也意味着重复验证。
我不确定是否有更好的方法继续下去。我无法找到更好的解决方案,在不重复验证的情况下保持最大安全性。
发布于 2013-12-12 12:59:24
我不同意“您应该验证每个函数的参数”--在您的示例中,这些是私有函数,因此它们只被调用类调用,因此在一个干净的房间中操作:不管调用它们是什么,都负责处理干净的数据。因此,您的示例中的验证只保留在操作本身中。
尽管如此,我相信验证会转移到它自己的类中,并根据需要插入表单或控制器。我使用Zend,并将验证器保留为服务层的一部分。Symfony似乎在执行类似的东西,在这里,您将验证描述为YAML模型的一部分,然后调用该模型上的验证器服务。
(旁白:这似乎遵循脂肪模型,瘦身控制器模式,这可能是垃圾。在ZF中,验证与模型是分开的。需要做更多的工作来连接各个部分,但模型中的浮肿较少。)
发布于 2013-12-12 12:48:26
最合适的方法是为此创建自己的验证器。我不喜欢这种验证方式--将来您的控制器将被不必要的代码重载:P最好像symfony教程中那样做。
https://stackoverflow.com/questions/20542989
复制相似问题