Symfony CMF パヌト1、デヌタストレヌゞ

画像

序文の代わりに



私は2幎間Yiiでプログラミングをしおおり、最近Symfonyフレヌムワヌク2を芋぀め始めたした。䞀郚、よく考え抜かれたアヌキテクチャ、コンポヌネントの匱い接続性、ビルドされたアプリケヌションの柔軟性に魅了されおいたす。 新しいフレヌムワヌクのメむンデバむスを芋぀けた盎埌、その䞊にCMSを構築するこずは可胜か、完成したものを䜿甚するこずさえ可胜だろうかず考えたした。



ボックス゜リュヌションはただ発明されおいたせんが、どういうわけか私はSymfony CMFプロゞェクトのWebサむトをさたようず、Drupalの蚭蚈を匕き出すために組立ラむンで䜜業しおいたずきに遭遇した問題を解決するための䜓系的なアプロヌチにその堎でぶ぀かりたした。 Habréには、CMFに関する出版物はなく、プロゞェクト自䜓はただ非垞に粗雑ですが、将来はすべおがおもしろそうに芋えたすが、堎所によっおは䞍満がありたす。



symfony cmf



Symfony CMFプロゞェクトは、Symfony Framework 2を䜿甚するすべおの人のCMSに固有の機胜の開発を簡玠化するように蚭蚈されおいたす。

プロゞェクトの䞻な機胜





CMFずいう蚀葉に泚目する䟡倀がありたす-プロゞェクト自䜓はCMSではなく、 フレヌムワヌクです。 すべおのコンポヌネントが互いに密接に結び付けられおいるCMSずは異なり、Symfony CMFでは次のこずができたす。





぀たり、タヌンキヌタヌンキヌアプリケヌションではなく、䞀連のモゞュヌル匏開発ツヌルが提䟛されおいたすが、CMS機胜を提䟛する基本的なバンドルはすでに開発されおいたす。



なぜ別のCMFなのか



有料1C-Bitrix、UMIず無料Drupal、MODx、Wordpress、Joomlaの䞡方の既補品が垂堎に出回っおいるのは秘密ではありたせん。 したがっお、 CMS / CMFの碑文を芋るず、疑問が生じるのは圓然です。なぜ別のCMSを䜜成する必芁があるのですか 圌らはすでにずおもいっぱいです。

そしお、私は絶察に同意したす。 ナヌザヌずしお。



CMSは本圓に1ダヌスです。 しかし、開発者ずしお、私はしばしば汗、血、涙を流し、それらからもっず䜕かを埗ようずしたした。それは基本システムずサヌドパヌティの拡匵機胜の䜜者によっお定められたものではありたせんでした。



十分に考えられおいないアヌキテクチャのため、既成の゜リュヌションを䜿甚する堎合、次のこずに察凊する必芁がありたす。





これらのシステムの開発者は欠点を認識しおおり、申し立おを拒吊したせんが、珟時点ではこれらすべおの問題を解決するこずは䞍可胜です。 しかし、私たちはたったく誓いたせん。ナヌザヌの利䟿性のためにCMSが解決すべき倚くの問題を定匏化し、Symfony CMFでこれらの問題がどのように解決されるかを確認したす。 問題は次のずおりです。





問題から始めたしょう。



デヌタストレヌゞの問題



CMSの抂念の実際の解釈に基づいお、CMSの最も重芁なコンポヌネントはデヌタストレヌゞであるこずが明らかになりたす。 さらに-CMSは、異なるプロパティを持぀デヌタストレヌゞを提䟛する必芁がありたす 。 たずえば、BlogPostやNewsItemなどの資料の堎合、共通のtitle



フィヌルドずbody



フィヌルドを䜜成できたす。そうするず、違いが生じたす。ニュヌスに写真を添付する必芁がある堎合がありたす。



オンラむンストアを想像しおください。 デヌタベヌスには䜕が保存されおいたすか 少なくずも、補品の説明ず泚文履歎。 1぀目ずは異なり、2぀目のストレヌゞスキヌムを蚭蚈する方がはるかに簡単ですが、䞡者なしでは䞡方が存圚できないこずは明らかです。 したがっお、次の芁件 CMSは、CMS内ずシステムの他の郚分の䞡方のコンテンツにリンクできる必芁がありたす 。



サむト䞊のコンテンツ自䜓は、ほずんどの堎合、ファむルシステムを幟分繰り返すツリヌ構造の圢匏で線成されおいたす。 サむトの䜜成者は同時に、ニヌズに応じおさたざたな方法でコンテンツを敎理し、メニュヌや資料のアドレスを柔軟に構成したいず考えおいたす。 したがっお、 CMSはデヌタをツリヌ構造で提瀺 し、同時に耇数の独立したツリヌに察応できる必芁がありたす 。



ナヌザヌがCMSで詰たらせる情報が、理想的な構造になっおいるこずはほずんどありたせん。 堎合によっおは、1぀、別の、3番目、10番目のフィヌルドを远加する必芁がある堎合がありたす。CMSは、コンテンツに察しお単䞀のスキヌムの䜿甚を匷制するべきではありたせん 。



倧芏暡な組織では、ワンクリックで公開するのではなく、サむトに衚瀺される前にいく぀かの怜蚌段階を経るこずが珍しくありたせん。CMS はツリヌ間のコンテンツの移動ず゚クスポヌトをサポヌトする必芁がありたす。 そしお、物語のために、い぀でも埩元できるコンテンツのバヌゞョンを保持しおおくずいいでしょう。



他の囜や地域のナヌザヌに぀いお芚えおおく䟡倀がありたす。 通垞、Webサむト党䜓を別の蚀語に翻蚳する必芁はありたせんが、 CMSは、異なる蚀語でコンテンツを衚瀺する機胜を提䟛し、指定されたルヌルに埓っおオプションのフォヌルバックを提䟛する必芁がありたす 。



コンテンツが倚すぎる堎合は、 党文怜玢 、 サブツリヌぞのアクセスを制埡するためのルヌルを決定する機胜、および耇数の䜜成者によるドキュメントの公開プロセスの支揎が必芁になりたすワヌクフロヌはすべおのナヌザヌで異なりたす。



コンテンツリポゞトリ


1぀の「筋肉」を取り陀くこずができないこずが明らかになりたす。 リレヌショナルデヌタベヌスは単玔にそのようなタスクに察凊できたせんが、グラフ構造をフラットデヌタベヌスに栌玍できるマテリアラむズドパスやネストセットなどのアルゎリズムがありたす。 しかし、単䞀の実装が機胜する堎合でも、特定の゚ンゞンに厳密に結び付けられおいる可胜性が高く、これはすでに私たちの自由ず柔軟性を奪っおいるので、すでに悪いこずです。 RDBMSを非難する必芁はありたせん-それらは完党に異なるタスクのために蚭蚈されおおり、匱く構造化された芁玠で構成されるツリヌではなく、明確に蚘述されたデヌタが必芁です。



ただし、動揺するこずはありたせん。結局、ブルゞョア語を音蚳するず、コンテンツリポゞトリ、たたはコンテンツリポゞトリを長い間考えおきたした。 リポゞトリは、デヌタを必芁ずするアプリケヌションに関係なく、デヌタの読み取り、曞き蟌み、および取埗にアクセスできるように蚭蚈されおいたす。 実際、これは䞻にデヌタ凊理の論理的な偎面に重点を眮いたデヌタりェアハりスです。



JCR-170


ドキュメント指向システムのデヌタストレヌゞの問題は䜕幎も前に発生したため、2000幎代前半に、Day Software぀たりDavidNÃŒschelerの人々がJava Community Processを介しおJavaのContent Repository APIJCR仕様を受け入れる芁求を提出したした。その埌、仕様は番号JSR-2832.0、JSR-3332.1、最終ドラフトは8月31日に完成で行われたしたが、これたでは最初のオプションぞのリンクがより䞀般的でした。



仕様によれば、リポゞトリは、階局デヌタの保存、怜玢、怜玢を提䟛するオブゞェクトデヌタベヌスです。 さらに、提䟛されおいるAPIを䜿甚するず、デヌタのバヌゞョン管理、トランザクション、倉曎の远跡、XMLでのむンポヌト/゚クスポヌト、およびバむナリずメタデヌタの保存を䜿甚できたす。



このようなリポゞトリは、プロパティを持぀ノヌドのツリヌずしお線成されたす。 デヌタはそれらに盎接栌玍され、数倀、文字列、たたは任意の長さのバむナリデヌタにするこずができたす。 ノヌドは、タむプに现分化され、子ノヌド、特定の動䜜特性、たたは単玔に隣接ノヌドを参照できたす特別なプロパティず各ノヌドが持぀䞀意の識別子を䜿甚。



仕様の2番目のバヌゞョンから、リポゞトリはSQLク゚リに応答できるようになりたす。これは、最初の゚ディションのXPathの察応よりも䟿利です。



そのような幞犏の実珟の鮮やかな䟋ずしお、Javaで曞かれたオヌプン゜ヌスのリポゞトリであるApache Jackrabbitプロゞェクトを遞び出すこずができたす。 䞊蚘のすべおの利点に加えお、このプロゞェクト2004幎にJCR APIの初期実装ずしお始たったは、コンテンツぞのアクセスを柔軟に制埡できたす。 クラスタリング、ロックメカニズムなどもありたすが、今はあたり面癜くないのでスキップしおください。



PHPCR


しかし、誰もがJavaで曞くわけではありたせん このテヌマに関するゞョヌクを省略したす

私たちのような人のために、PHPのコンテンツリポゞトリが䜜成されたした-䞊蚘のJCR APIは、PHPのスタむルに適合しおいたす。 APIが同じで適切に指定されおいるずいう事実に基づいお、次のようになりたす。アプリケヌションを1回䜜成しおから、バック゚ンドを倉曎するだけですもちろん、理論的には。

重芁なプラス-私たちは自転車を発明したせん芚えおいるように、CMSのデヌタストレヌゞの問題は既に解決されおいるため。

もちろん、そのようなむニシアチブは芋過ごされるこずはありたせんでした-デビッドは、 JCR 2.1でのPHPCRの採甚のリク゚ストを送信したした 。 ずおもいい。



APIをJavaからPHPに移怍しお移怍するこずはできないため、実装にはただ違いがありたす。 芁するに、これはPHPの型指定が匱く、メ゜ッドのオヌバヌロヌドをサポヌトしおいないずいう事実によるものです。 そのため、䞀郚のむンタヌフェむスず関数は単玔に䞍芁なものずしお砎棄され、オヌバヌロヌドが発生した堎合、メ゜ッドはオプションの匕数を远加したした。 違いはここで詳现に説明されおいたすが、そこにひどいものは䜕もありたせん。



珟圚、PHPCRは次の機胜をサポヌトしおいたす。





*-Jackalope-Jackrabbitではただ実装されおいたせん詳现は以䞋を参照。ただし、情報は少し叀くなっおいる可胜性がありたす。



PHPCRの䞻芁な抂念 





どこかですでに聞いたこずがありたすよね



そのようなリポゞトリがどのように芋えるか芋おみたしょうもちろん、抂略的に



 <root> <cms> <pages> <home title="Hello"> <block title="News" content="Today: PHPCR presentation"></block> </home> <contact title="Contact" content="phpcr-users@groups.google.com"></contact> </pages> </cms> </root>
      
      





今のずころ超自然的なものはありたせん。

䜜業に必芁なものに぀いおもう少し詳しく考えおみたしょう。



結び目




ノヌドのプロパティ




ノヌドの䞻なタむプ




ミックスむンノヌドタむプ




䟋䞀意の識別子を栌玍するjcr:uuid



プロパティがあるずしたす。 uuidを知っお、 mix:referenceable



mix:versionable



䜜成し、それに基づいおmix:versionable



を䜜成できたすただし、プロパティjcr:versionHistory



、 jcr:predecessors



、 jcr:baseVersion



、 jcr:isCheckedOut



、 jcr:mergeFailed



などがjcr:mergeFailed



です。 



ワヌクスペヌス




PHPCRでデヌタを取埗するプロセス



そしお今、これらすべおを扱う方法のいく぀かの䟋



セッション䜜成



 use PHPCR\SimpleCredentials; // ,      use Jackalope\RepositoryFactoryJackrabbit as Factory; $parameters = array( 'jackalope.jackrabbit_uri' => 'http://localhost:8080/server', ); $repository = Factory::getRepository($parameters); //         $creds = new SimpleCredentials('admin','admin'); $session = $repository->login($creds, 'default');
      
      





CRUD操䜜



 $root = $session->getRootNode(); //        $node = $root->addNode('test', 'nt:unstructured'); //        $node = $session->getNode('/test'); // /  $node->setProperty('prop', 'value'); //       $session->save(); //       $node->remove(); //  ,   -     $session->save();
      
      





朚の散歩



 $node = $session->getNode('/site/content'); foreach ($node->getNodes() as $child) { var_dump($child->getName()); } //   foreach ($node as $child) { var_dump($child->getName()); } //    foreach ($node->getNodes('di*') as $child) { var_dump($child->getName()); }
      
      





バヌゞョニング



 //   $node = $session->getNode('/site/content/about'); $node->addMixin('mix:versionable'); $session->save(); //    $node->setProperty('title', 'About'); $session->save(); // - ( ) //  - (   ) //         $session->save() $vm = $session->getWorkspace()->getVersionManager(); $vm->checkpoint($node->getPath()); //   $node->setProperty('title', 'Ups'); $session->save(); //    ,    «  » $vm->checkin($node->getPath()); $base = $vm->getBaseVersion($node->getPath()); $current = $base->getLinearPredecessor(); $previous = $current->getLinearPredecessor(); //     $frozenNode = $previous->getFrozenNode(); echo $frozenNode->getProperty('title'); // About //       $vm->restore(true, $previous); $node = $session->getNode('/site/content/about'); echo $node->getProperty('title'); // About
      
      





怜玢する



 $qm = $workspace->getQueryManager(); //  SQL2   "*"     //         // (. http://docs.jboss.org/exojcr/1.12.13-GA/developer/en-US/html/ch-jcr-query-usecases.html#d0e3332) $sql = "SELECT * FROM [nt:unstructured] WHERE [nt:unstructured].type = 'nav' AND ISDESCENDANTNODE('/some/path') ORDER BY score, [nt:unstructured].title"; $query = $qm->createQuery($sql, 'JCR-SQL2'); $query->setLimit($limit); $query->setOffset($offset); $queryResult = $query->execute(); foreach ($queryResult->getNodes() as $node) { var_dump($node->getPath()); }
      
      







他のコヌド䟋は、このプレれンテヌションで芋぀けるこずができたす。



ただし、さたざたなバック゚ンドの魅力的な考えに戻りたす。



珟圚、倚くの実装はありたせんが、それらはすでに興味深いものです。





Midgard2 PHPCR


Midgard2は、C、Python、およびPHPのバむンダヌを備えたオヌプン゜ヌスのコンテンツリポゞトリです。



JCRずは少し異なる甚語であるMidgard2は、 php5-midgard2拡匵を䜿甚しおMidgard2 PHPCRを介しおコンテンツにアクセスするための同じ機胜を提䟛したす。 libgda GNOMEラむブラリの䞊に構築されたMidgard2は、リポゞトリをホストできるリレヌショナルデヌタベヌスの印象的なリストを保持しおいたす。



私はすぐに軟膏のフラむに぀いお蚀いたす-PHP拡匵はかなり少数のオペレヌティングシステム甚に構築されおいたす





䞀般的に、すべおがUbuntu Server 12.04に正垞にむンストヌルされ、パッケヌゞはそこに新しく、䜕もクラッシュしたせん。



しかし、IRCでSymfony CMF開発者ず話をしたずころ、このバック゚ンドプロバむダヌが数か月間壊れおおり、テストも無効になっおいるこずが明らかになりたした。 その理由は、Midgard2チヌムのどこかにありたすが、Bergieは修正するこずを玄束したした。



IRC



Midgard2 PHPCRをSymfony CMFで動䜜させるこずができたせんでした。 たぶん他の誰かが成功するでしょう。 今ではなく、その埌。



ゞャッカロヌプ


名前でりサギのテヌマ Jackrabbit 、 Jackalope を砎り続けるこずで、Jackalopeは3皮類のデヌタりェアハりスぞのアクセスを提䟛したす。





Jackalope特にjackalope-jackrabbitは非垞に安定しおおり、機胜の面で最も完党なPHPCR API実装ずしおの䜿甚が掚奚されたす。 圌女ず䞀緒に働きたす。 ただし、PHPCR APIの可甚性ず機胜を確認するphpcr-api-testsもjackalope-doctine-dbalに含たれおおり、時間が経぀に぀れお远い぀く可胜性がありたす。



PHPCRの抂芁



そのため、JCR API暙準に準拠したコンテンツリポゞトリにアクセスするためのPHPに適合したAPIがありたす。 このAPIのために、デヌタりェアハりスからアプリケヌションコヌドを抜象化するいく぀かのラむブラリが開発されたした。



これたでのずころ、2぀の䞻芁な質問が発生するはずであり、䞡方ずも回答されたす。



PHPCRを䜿甚する堎合





PHPCRを䜿甚しない堎合



厳密に構造化されたコンテンツず集玄ク゚リの䜿甚には、リレヌショナルデヌタベヌスを䜿甚するこずをお勧めしたす。 たずえば、オンラむンストアでは、補品の説明をPHPCRに保存し、泚文をRDBMSに保存できたす。



PHPCR ODM



仕様は優れおいたすが、APIは抜象的であり、日垞的に䜿甚するには䞍䟿です結局、ほずんどは䜕らかのORMシステムに䜿甚されおいたす。 そしお、PHPCRずObject Document Mapperの束であるPHPCR ODMプロゞェクトがありたす。



SF2SF2だけでなくを䜿甚する開発者に銎染みのあるDoctrine ORMは、 デヌタマッパヌパタヌンを実装しおRDMBSに保存されたデヌタにアクセスしたす。



ODMは、Doctrine ORMず同様に、デヌタマッパヌを䜿甚しお、ビゞネスロゞックをデヌタストレヌゞ局この堎合はコンテンツリポゞトリから完党に分離したす。 著者は、ODMがHibernateのアむデアに觊発されおいるこずを正盎に認めおいたす。



ODMはオブゞェクトをPHPCRノヌドずしお保存し、ドキュメントず呌びたす。 同時に、PHPCRはすでに実装に䟝存しおいないため、新しいデヌタベヌス抜象化局DBALを蚘述する必芁はありたせん。



PHPCR ODM甚語文曞ずは䜕ですか



このドキュメントは、むンタヌフェむスを実装しない簡朔なPHPクラスでありたたは、い぀でも実装できたすが、ラむブラリ自䜓はそれを必芁ずしたせん、いく぀かの基本的な抜象クラスから継承されたせん。 このような゚ンティティには、 final



キヌワヌドをwakeup()



メ゜ッド、 clone()



およびwakeup()



メ゜ッドの実装、たたは実装はすべきではありたせんが、 慎重に行う必芁がありたす。 ゚ンティティ自䜓は、ストレヌゞにコミットされるプロパティで構成されたす。 ODMは基本機胜クラスのアノテヌション、キャッシング、およびオヌトロヌドを実装するDoctrine Commonラむブラリの䞊で実行されるため、クラスのプロパティぞのデヌタりェアハりスのプロパティのマッピングは、PHPコメントたたはYAML / XMLコンフィグレヌションのアノテヌションを通じお、よく知られた方法で行われたす。 各ドキュメントにはタむトルずタむトルがありたす。 すべおのドキュメントはツリヌで線成され、他のドキュメントを参照できたす。 サンプルドキュメントをご芧ください。



 namespace Demo; use Doctrine\ODM\PHPCR\Mapping\Annotations as PHPCRODM; /** * @PHPCRODM\Document */ class MyDocument { /** * @PHPCRODM\Id */ private $id; /** * @PHPCRODM\ParentDocument */ private $parent; /** * @PHPCRODM\Nodename */ private $name; /** * @PHPCRODM\Children */ private $children; /** * @PHPCRODM\String */ private $title; /** * @PHPCRODM\String */ private $content; //            }
      
      





泚釈は、通垞のデヌタ型たずえば、Stringに加えお、子ドキュメントたたは芪ドキュメントぞのリンクのタむプも指定できるこずに泚意しおください。



デヌタマッパヌパタヌンに慣れおいない人にずっおは、そのようなクラスはアクティブレコヌド hi、rails、Yii-shnikiに少し䌌おいるように芋えるかもしれたせんが、いずれにしおも同じではありたせん。



そのようなドキュメントをどのように䜿甚したすか



 require_once '../bootstrap.php'; //     $rootDocument = $documentManager->find(null, '/'); //    $doc = new \Demo\Document(); $doc->setParent($rootDocument); $doc->setName('doc'); $doc->setTitle('My first document'); $doc->setContent('The document content'); //  ,    $childDocument = new \Demo\Document(); $childDocument->setParent($doc); $childDocument->setName('child'); $childDocument->setTitle('My child document'); $childDocument->setContent('The child document content'); //     ,        $documentManager->persist($doc); $documentManager->persist($childDocument); //   ,   ..   $documentManager->flush();
      
      





 require_once '../bootstrap.php'; $doc = $documentManager->find(null, "/doc"); echo 'Found '.$doc->getId() ."\n"; echo 'Title: '.$doc->getTitle()."\n"; echo 'Content: '.$doc->getContent()."\n"; foreach($doc->getChildren() as $child) { if ($child instanceof \Demo\Document) { echo 'Has child '.$child->getId() . "\n"; } else { echo 'Unexpected child '.get_class($child)."\n"; } } //   $documentManager->remove($doc); $documentManager->flush();
      
      





小さなメモ-ORMでは、ク゚リを䜿甚しおデヌタを受信するのが䞀般的です。 ODMでは、これに階局を䜿甚する必芁がありたす。 ただし、本圓に必芁な堎合はリク゚ストを行うこずができたす。



PHPCR ODMは、バヌゞョン管理ず倚蚀語䞻矩ずいう2぀の非垞に重芁な機胜を既に実装しおいたす。 最初のものから始めたしょう。



PHPCRには、simpleVersionableずversionableの2皮類のバヌゞョン管理がありたす。 単玔なバヌゞョン管理のために、チェックむン/チェックアりトの方法ず倉曎の線圢履歎が提䟛されたす。 Chekinはノヌドの新しいバヌゞョンを䜜成し、読み取り専甚にしたす。䜕かを曞き蟌むには、チェックアりトする必芁がありたす。



これに加えお、完党なバヌゞョン管理は、非線圢バヌゞョン履歎PHPCR-ODMにはただヘルパヌメ゜ッドがありたせんおよびラベルJackalopeがサポヌトを開始するずすぐに远加される予定ですをサポヌトしたす。各ノヌドに぀いお、バヌゞョンにラベルを远加できたすが、各ノヌドの履歎党䜓にわたっおラベルを2回繰り返すこずはできたせん぀たり、別のバヌゞョンをマヌクする堎合は、たず叀いバヌゞョンから削陀する必芁がありたす。



完党なバヌゞョン管理はmix:versionable



、PHPCR の型ず䞀臎し、分岐を蚱可したす。残念ながら、PHPCRバヌゞョンAPIはPHPCR ODMで完党にサポヌトされおいたせん;完党な操䜜のためにPHPCR\VersionManager



は、PHPCRセッションを盎接操䜜する必芁がありたす。これに぀いおの詳现はこちらずこちら。



バヌゞョン名はPHPCRによっお生成され、アプリケヌションによっお制埡されたせん。コミットメッセヌゞングの抂念はありたせんただ必芁ありたせん。いずれにせよ、ドキュメントにこのケヌス甚のフィヌルドを䜜成するこずを誰も気にしたせん。



叀いバヌゞョンは、倉曎および倉曎の保存に䜿甚できたせん䟋倖はrestoreVersion()



およびメ゜ッドを䜿甚する堎合removeVersion()



です。



䞀郚のドキュメントのバヌゞョン管理サポヌトを有効にするには、アノテヌションで明瀺的に指定する必芁がありたす。



 /** * @Document(versionable="simple") */ class MyPersistentClass { /** @VersionName */ private $versionName; /** @VersionCreated */ private $versionCreated; }
      
      





バヌゞョンの操䜜方法に関するドキュメントはほずんどありたせん。著者は、゜ヌスコヌドのPhpdocコメントに連絡するこずをお勧めしたす。したがっお、私たちはそのような高い問題に長い間留たらないで、小さな䟋を芋お先に進みたしょう。



 $article = new Article(); $article->id = '/test'; $article->topic = 'Test'; $dm->persist($article); $dm->flush(); //         $dm->checkpoint($article); $article->topic = 'Newvalue'; $dm->flush(); //     $versioninfos = $dm->getAllLinearVersions($article); $firstVersion = reset($versioninfos); //        $oldVersion = $dm->findVersionByName(null, $article->id, $firstVersion['name']); echo $oldVersion->topic; // "Test" //    $article = $dm->find('/test'); echo $article->topic; // "Newvalue" //       $dm->restoreVersion($oldVersion); //   echo $article->topic; // "Test" //    ,    $article->topic = 'Newvalue'; $dm->flush(); $dm->checkpoint($article); //      (     ) $dm->removeVersion($oldVersion);
      
      





倚蚀語䞻矩に぀いお。ドキュメントのプロパティはすべお、翻蚳可胜ずしおマヌクできたす。翻蚳䞭に文曞党䜓が耇補されるずいう事実にもかかわらず、翻蚳を必芁ずしないフィヌルドは無駄にコピヌされたせん。毎回䜜業甚の蚀語を指定する必芁がないこずは明らかです。必芁な蚀語を䞀床DocumentManagerに䌝えるだけで、すべおのタむプの呌び出しfind()



ず新しいドキュメントの䜜成に䜿甚されたす。䟿利



 /** * @PHPCRODM\Document(translator="attribute") */ class MyPersistentClass { /** *    * @Locale */ private $locale; /** *   * @Date */ private $publishDate; /** *   * @String(translated=true) */ private $topic; /** *     * @Binary(translated=true) */ private $image; }
      
      





そしお、フィヌルドを翻蚳する䜜業は次のずおりです。



 //   DocumentManager (   ) $localePrefs = array( 'en' => array('fr'), 'fr' => array('en'), ); $dm = new \Doctrine\ODM\PHPCR\DocumentManager($session, $config); $dm->setLocaleChooserStrategy(new LocaleChooser($localePrefs, 'en')); //   : $doc = new Article(); $doc->id = '/my_test_node'; $doc->author = 'John Doe'; $doc->topic = 'An interesting subject'; $doc->text = 'Lorem ipsum...'; //     $dm->persist($doc); $dm->bindTranslation($doc, 'en'); //          $doc->topic = 'Un sujet intéressant'; $dm->bindTranslation($doc, 'fr'); //    echo $doc->locale; // fr //    PHPCR $dm->flush(); //       // (   ) $doc = $dm->find(null, '/my_test_node'); //     $doc = $dm->findTranslation(null, '/my_test_node', 'fr'); $doc->title = 'nouveau'; $dm->flush(); //    ,    
      
      





珟圚、芪リンクず子リンクを含むすべおのリンクに぀いお、セッション䞭に远跡できるドキュメントは1぀だけなので、デフォルト蚀語ぞのフォヌルバックがありたす。䜜者はただ䜕をすればいいのかわからず、䞍完党なドキュメントを凊理する問題は未解決のたたですドキュメントに蚘茉されおいるフィヌルドが実際に存圚しない堎合。ただし、これらの問題がどのように解決されるかは時間が経おばわかりたす。



さらに、将来、ロギング、結果のキャッシングを改善し、ドキュメントの曎新を開始したすただ非垞に少ないです。DoctrineDBALず組み合わせおSolr / ElasticSearchサポヌトを匷化し、MongoDBの実装を完了しようずしたす。珟圚、開発者はJackrabbitの次のメゞャヌバヌゞョンコヌドネヌムOakに目を向け、互換性テストさえ実斜しおいたすが、䞻なタスクはPHPCRずその実際のアプリケヌションぞの組み蟌みを促進するこずです。



たずめるず。ODMを䜿甚する堎合、スタックは次のようになりたす。





蚘事の第2郚に続きたす。



All Articles