8

私は Symfony2.2 を StofDoctrineExtensionsBundle (および Gedmo DoctrineExtensions) と共に使用しています。私は単純なエンティティを持っています

/**
 * @ORM\Entity
 * @Gedmo\Loggable
 * @ORM\Table(name="person")
 */
class Person {
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

[...]

    /**
     * @ORM\Column(type="datetime", nullable=true)
     * @Assert\NotBlank()
     * @Assert\Date()
     * @Gedmo\Versioned
     */
    protected $birthdate;
}

既存のオブジェクトの属性を変更すると、テーブルにログ エントリが作成されますext_log_entries。このログ テーブルのエントリには、変更された列のみが含まれます。ログは次の方法で読み取ることができます。

$em = $this->getManager();
$repo = $em->getRepository('Gedmo\Loggable\Entity\LogEntry');
$person_repo = $em->getRepository('Acme\MainBundle\Entity\Person');

$person = $person_repo->find(1);
$log = $repo->findBy(array('objectId' => $person->getId()));
foreach ($log as $log_entry) { var_dump($log_entry->getData()); }

しかし、私が理解していないbirthdateのは、変更されていないにもかかわらず、フィールドが常にログエントリに含まれている理由です。3 つのログ エントリの例を次に示します。

array(9) {
  ["salutation"]=>
  string(4) "Herr"
  ["firstname"]=>
  string(3) "Max"
  ["lastname"]=>
  string(6) "Muster"
  ["street"]=>
  string(14) "Musterstraße 1"
  ["zipcode"]=>
  string(5) "00000"
  ["city"]=>
  string(12) "Musterhausen"
  ["birthdate"]=>
  object(DateTime)#655 (3) {
    ["date"]=>
    string(19) "1893-01-01 00:00:00"
    ["timezone_type"]=>
    int(3)
    ["timezone"]=>
    string(13) "Europe/Berlin"
  }
  ["email"]=>
  string(17) "email@example.com"
  ["phone"]=>
  NULL
}

array(2) {
  ["birthdate"]=>
  object(DateTime)#659 (3) {
    ["date"]=>
    string(19) "1893-01-01 00:00:00"
    ["timezone_type"]=>
    int(3)
    ["timezone"]=>
    string(13) "Europe/Berlin"
  }
  ["phone"]=>
  string(9) "123456789"
}

array(2) {
  ["birthdate"]=>
  object(DateTime)#662 (3) {
    ["date"]=>
    string(19) "1893-01-01 00:00:00"
    ["timezone_type"]=>
    int(3)
    ["timezone"]=>
    string(13) "Europe/Berlin"
  }
  ["phone"]=>
  NULL
}

本当に変更されたデータのみをログに記録したい。まだ見ていないオプションはありますか? それがbirthdateDateTimeであることに関係しているようですね。

EDITDateTimeオブジェクト とは関係ありません。これは、他のエンティティでも発生します。単純な値を含む別のエンティティがあります。

/**
 * @ORM\Entity
 * @Gedmo\Loggable
 * @ORM\Entity(repositoryClass="Acme\MainBundle\Repository\ApplicationRepository")
 * @ORM\Table(name="application")
 */
class Application {

[...]

    /**
     * @ORM\Column(type="integer")
     * @Assert\NotBlank(groups={"FormStepOne", "UserEditApplication"})
     * @Gedmo\Versioned
     */
    protected $insurance_number;
}

ブラウザーで編集フォームを開いて変更せずに保存すると、ログ テーブルには次のものが含まれます。

update  2013-04-26 11:32:42     Acme\MainBundle\Entity\Application  a:1:{s:16:"insurance_number";s:7:"1234567";}
update  2013-04-26 11:33:17     Acme\MainBundle\Entity\Application  a:1:{s:16:"insurance_number";s:7:"1234567";}

なんで?

4

3 に答える 3

0

\DateTime私はまだそれに取り組んでいますが、質問の2番目の部分については、私のプロパティに関する問題を解決する方法がありますNumeric:

/**
 * @ORM\Entity
 * @Gedmo\Loggable
 * @ORM\Entity(repositoryClass="Acme\MainBundle\Repository\ApplicationRepository")
 * @ORM\Table(name="application")
 */
class Application {

[...]

    /**
     * @ORM\Column(type="integer")
     * @Assert\NotBlank(groups={"FormStepOne", "UserEditApplication"})
     * @Gedmo\Versioned
     */
    protected $insurance_number;
}

insurance_numberここでは整数プロパティとして宣言しますが、私たちが知っPHPているように型がなく、 と競合する動的キャストを行いGedmo Loggableます。

を解決するには、自分自身または自分で明示的なキャストを行っていることを確認してSetter MethodくださいBusiness Logic

たとえば、これを置き換えます(ビジネスロジック):

$application->setInsuranceNumber($valueComeFromHtmlForm)

これで:

$application->setInsuranceNumber( (int)$valueComeFromHtmlForm)

その後、オブジェクトを永続化すると、ログにレコードが表示されなくなります。

Loggableこれは、またはDoctrine Change Tracker期待Integerして受け取りString (which is a 'not casted Integer')、プロパティをダーティとマークするためだと思います。Log Record(S新しい値が文字列であることを示します。)

于 2016-10-18T08:41:40.450 に答える