oh / form-error-log-bundle
记录表单错误
dev-master
2015-04-02 12:43 UTC
Requires
- php: >=5.3.2
- symfony/framework-bundle: ~2.1
This package is not auto-updated.
Last update: 2024-09-14 13:20:08 UTC
README
记录表单错误。
对表单进行功能测试固然很好,但如何知道用户是否正确使用呢?此插件可以记录用户所犯的错误,以便您可以发现任何可用性问题。
警告:如果错误涉及整个表单,此捆绑包将尝试使用json_encode对绑定实体进行编码。如果无法进行json_encode,它将尝试在最终记录整个表单的_post请求之前进行序列化。如果用于包含敏感数据(如密码或信用卡信息)的表单,这将是一个安全风险。在这种情况下,您应该在绑定对象上实现Serializable或JsonSerializable(PHP 5.4)接口以阻止敏感数据。
安装
由于缺乏对不同表单类型的测试,此捆绑包处于alpha稳定性。您的composer.json需要通过设置minimum-stability为"alpha"或"dev"来反映这一点
"minimum-stability": "alpha"
通过将捆绑包添加到composer.json中,按照常规安装此捆绑包
"oh/form-error-log-bundle": "dev-master"
在app/AppKernel.php
中注册捆绑包
// app/AppKernel.php
public function registerBundles()
{
return array(
// ...
new Oh\FormErrorLogBundle\OhFormErrorLogBundle(),
);
}
设置
提供了两种日志记录方法。一种使用您的常规记录器(Monolog),另一种记录到数据库
方法1:Monolog
您需要在Monolog设置中创建一个名为'formerror'的新通道
#app/config/config_prod.yml
monolog:
handlers:
main:
type: fingers_crossed
action_level: error
handler: nested
nested:
type: stream
path: %kernel.logs_dir%/%kernel.environment%.log
level: debug
formerror:
type: stream
path: %kernel.logs_dir%/form-error-%kernel.environment%.log
channels: formerror
方法2:数据库
此方法使用Doctrine。您应该创建自己的实体,该实体实现了FormErrorLogEntityInterface
<?php
namespace Your\Bundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Oh\FormErrorLogBundle\Entity\FormErrorLogEntityInterface;
/**
* @ORM\Table(name="form_error_log")
* @ORM\Entity
*/
class FormErrorLog implements FormErrorLogEntityInterface
{
/**
* @var integer $id
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\Column(name="form_name", type="string", length=255)
* @var type
*/
private $form_name;
/**
* @var string $field
*
* @ORM\Column(name="field", type="string", length=255)
*/
private $field;
/**
* @var string $error
*
* @ORM\Column(name="error", type="string", length=2000)
*/
private $error;
/**
* @var string $error
*
* @ORM\Column(name="value", type="string", length=2000)
*/
private $value;
/**
* @var string $uri
*
* @ORM\Column(type="string", length=512)
*/
private $uri;
public function getFormName()
{
return $this->form_name;
}
public function setFormName($formName)
{
$this->form_name = $formName;
}
public function getField()
{
return $this->field;
}
public function setField($field)
{
$this->field = $field;
}
public function getError()
{
return $this->error;
}
public function setError($error)
{
$this->error = $error;
}
public function getValue()
{
return $this->value;
}
public function setValue($value)
{
$this->value = $value;
}
public function setUri($uri)
{
$this->uri = $uri;
return $this;
}
public function getUri()
{
return $this->uri;
}
}
您可以使用自己的方法来存储日期(我使用Gedmo Timestampable)
在您的parameters.yml中,您可以将类设置为您的实体
#app/config/parameters.yml
oh_form_error_log.db.entity.class: Your\Bundle\Entity\FormErrorLog
您的表单
将监听器插入到您的表单类中
#YourBundle/Form/YourEntityType.php
<?php
namespace Your\Bundle\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
class YourEntityType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
if($options['logger']) {
$builder->addEventSubscriber($options['logger']);
}
}
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'Your\Bundle\Entity\YourEntity',
'logger'=>false
));
}
public function getName()
{
return 'your_bundle_yourentity';
}
}
并在您的控制器中
<?php
namespace Your\Bundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Your\Bundle\Entity\YourEntityType;
class YourController extends Controller
{
public function createAction()
{
$form = $this->createForm(new YourEntityType(), $entity, array(
'logger'=>$this->get('oh_form_error_log.listener'))
// or for the database version
//'logger'=>$this->get('oh_form_error_log.listener.db'))
);
if ($form->isValid()) {
// do stuff
}
return array(
'form' => $form->createView(),
);
}
}
待办事项
- 测试
- 支持Symfony\Component\Serializer\Normalizer
- 使用不同的表单类型(如FileType)进行测试
致谢
- Ollie Harridge (ollietb) 为作者。