lendable/form-error-log-bundle

此包已被废弃,不再维护。未建议替代包。

记录表单错误

v2.0.0 2017-11-24 17:39 UTC

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 作为维护者。