다음 CLI 스크립트로 설명하는 문제를 재현 할 수 없습니다. 이들은 예제 (ODM 저장소에 포함)를 모델로 작성되었으며 동일한 디렉토리에서 실행 중입니다.
첫 번째 스크립트 poll.php
는 초에 한번씩 특정 문서를 새로 고쳐 일부 문자열 필드를 인쇄합니다
<?php
require_once __DIR__ . '/config.php';
$id = new MongoId('5432e4e6e84df199228b4567');
$repo = $dm->getRepository('Documents\User');
$user = $repo->findOneBy(['_id' => $id]);
$iteration = 0;
printf("%d: %s\n", $iteration, $user->getUsername());
poll: {
sleep(1);
$iteration++;
$dm->refresh($user);
printf("%d: %s\n", $iteration, $user->getUsername());
}
goto poll;
두 번째 스크립트 modify.php
는 임의의 문자열에 동일한 문서의 필드를 변경합니다.
<?php
require_once __DIR__ . '/config.php';
use Documents\User;
$id = new MongoId('5432e4e6e84df199228b4567');
$user = new User();
$user->setId($id);
$user->setUsername(md5(rand()));
$dm->persist($user);
$dm->flush();
printf("Changed username to: %s\n", $user->getUsername());
는 I는
tools/sandbox/Documents/User.php
모델 작은 변화를 만들어지고
setId()
방법을 추가했다. 이렇게하면
modify.php
스크립트가 처음 실행될 때 upsert를 수행하고 나중에 수정할 문서를 만들 수 있습니다. 대신에이 두 파일로
, 나는 문서 작성하여 일을 시작했다 : 나는 다음 두 번째 터미널에서 poll.php
을 시작
$ php modify.php
Changed username to: 9bdfab05b06306e97d2f63c9bc0a34ef
및 modify.php
을 실행하는 것을 계속 몇 번 :
$ php poll.php
0: 9bdfab05b06306e97d2f63c9bc0a34ef
1: 9bdfab05b06306e97d2f63c9bc0a34ef
2: 8420c8ef0ee7194624fead56585e8be5
3: 8420c8ef0ee7194624fead56585e8be5
4: bf2ec4bafae4cf47e3162ce857e861e7
5: bf2ec4bafae4cf47e3162ce857e861e7
6: bf2ec4bafae4cf47e3162ce857e861e7
7: 2051dd54bc2883f6c11e6c2bbfdfd13e
8: 2051dd54bc2883f6c11e6c2bbfdfd13e
9: 2051dd54bc2883f6c11e6c2bbfdfd13e
DocumentManager::refresh()
내에서 전화를 추적하면 Doctrine\MongoDB\Collection
래퍼 클래스를 통해 원시 문서 데이터를 쿼리하는 매우 궁극적으로 DocumentPersister::refresh()
이 호출됨을 알 수 있습니다. 데이터를 가져오고 원본 문서 데이터를 다시 설정합니다 (변경 집합 계산에 사용됨). 스냅 샷에 수화되고 재 할당 된 원시 데이터 (MongoDB에서)를 디버깅하는 것이 새로운 데이터를 보지 못한다면 시작할 수있는 좋은 곳입니다.
여러 개의 EntityManagers로 인해 두 번째 컨트롤러에서 객체를 분리해야한다고 생각합니다. – manix