lendable / form-error-log-bundle
此包已被废弃,不再维护。未建议替代包。
记录表单错误
v2.0.0
2017-11-24 17:39 UTC
Requires
- php: >=5.5
- symfony/symfony: ~2.7|~3.0|~4.0
Requires (Dev)
- jakub-onderka/php-parallel-lint: ^0.9.2
README
记录表单错误。
对表单进行功能测试很好,但你如何知道用户是否正确使用它呢?此插件可以记录用户犯的错误,以便您可以发现任何可用性问题。
警告:如果错误出现在整个表单上,此包会尝试使用json_encode对绑定的实体进行编码。如果无法进行json_encode编码,它将尝试序列化,最后记录整个表单的整个_POST请求。如果在包含敏感数据(如密码或信用卡信息)的表单上使用,这是一个安全风险。如果是这种情况,您应该在绑定的对象上实现Serializeable或JsonSerializable(PHP 5.4)接口以屏蔽敏感数据。
安装
由于缺乏对不同表单类型的测试,此包处于alpha稳定性。
通过将以下内容添加到composer.json中,按常规安装此包
"lendable/form-error-log-bundle": "~1.0"
在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) 作为原始作者。
- Lendable Ltd 作为维护者。