我想知道验证输入变量的最佳方法在哪里。您可以为每个框架应用此问题,但在我的情况下,它是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
条件和两个私函数。但是,我猜这应该是更安全的验证方式,因为你不能“忘记”验证,因为每个函数都验证自己的参数。但也意味着重复的验证。
我不确定是否有更好的方法可以继续。我无法找到更好的解决方案,在不重复验证的情况下保持最大安全性。
答案 0 :(得分:1)
我不同意“你应该验证每个函数的参数” - 在你的例子中,那些是私有函数,因此它们只由调用类调用,因此在一个干净的房间里运行:无论调用它们是什么负责处理干净的数据。因此,您的示例中的验证仅保留在适当的操作中。
也就是说,我认为验证会移动到自己的类中,并根据需要插入到表单或控制器中。我使用Zend Framework,并且我将验证器保留为服务层的一部分。 Symphony似乎执行something similar,看起来您将验证描述为模型YAML的一部分,然后在该模型上调用验证器服务。
(旁白:这似乎遵循胖模型,瘦的控制器模式,可能是rubbish。在ZF中,验证与模型是分开的。必须做更多的事情来连接碎片,但那里在模型中不那么臃肿。)
答案 1 :(得分:0)
最合适的方法是为此创建自己的验证器。 我不喜欢这种验证方式 - 将来你的控制器会被不必要的代码重载:P 最好像在symfony的教程中一样尝试这样做