你决定继续读10分钟Symfony CMF了吗?这是个好消息!在这一章,你将学习更多关于CMF默认的数据库层的知识。
这章会再次讨论PHPCR的存储层。但CMF的存储是可以混合创建的,这意味着他没有特定的存储系统。
熟悉PHPCR
PHPCR存储所有数据到一个大树状结构中。你能够比对一个文件系统的每个文件和目录包含的数据。这意味着所有的数据被存储,与PHPCR有关系,至少有一个其他数据:他的父节点。当然逆关系关系也是存在的,你也能获取一个数据元素的子节点。
让我们看一看上一章我们下载的标准版的树状。来到你的目录并执行下面命令:
1 |
$ php app/console doctrine:phpcr:node:dump |
PHPCR树状的结果是:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
ROOT: cms: simple: about: contact: map: team: quick_tour: dynamic: docs: demo: demo_redirect: hardcoded_dynamic: hardcoded_static: |
在PHPCR中每个数据都是一个被调用的节点。在这个树中,有13个节点和一个根节点(通过PHPCR被创建)。你可能已经看到您在前一节中创建的文档,他调用quick_tour(并且他的路径是/cms/simple/quick_tour)。当使用SimpleCmsBundle时,所有节点存储在/cms/simple路径。
每个节点都有属性,就是包含的数据。为你页面设置的content,title和label都被保存在quick_tour节点下的属性。你能够通过在dump命令行添加–props开关预览属性。
之前,这个PHPCR树与一个文件系统比较。他给你一个良好的形象,对于发生的,但他不是真相。你可以更好的比作他为一个XML文件,这里每一个节点是一个元素并他的属性比作是XML属性。
Doctrine PHPCR-ODM
Symfony CMF使用 Doctrine PHPCR-ODM与PHPCR交互。Doctrine允许一个用户去创建对象(调用documents),直接持久化并从PHPCR中检索。这个类似于symfony2框架中Doctrine ORM的使用,但这是PHPCR。
用代码创建一个页面
现在你知道更多关于PHPCR的知识,并且你知道与它交互的工具,你自己可以开始使用它。在前面的章节中,你通过使用yaml文件创建一个页面,通过SimpleCmsBundle解析。这次,你将通过自己完成创建一个页面。
首先,你需要去创建一个新的DataFixture到你的新页面。在AcmeDemoBundle中创建一个新页面。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
// src/Acme/DemoBundle/DataFixtures/PHPCR/LoadPageData.php namespace Acme\DemoBundle\DataFixtures\PHPCR; use Doctrine\Common\Persistence\ObjectManager; use Doctrine\Common\DataFixtures\FixtureInterface; use Doctrine\Common\DataFixtures\OrderedFixtureInterface; class LoadPageData implements FixtureInterface, OrderedFixtureInterface { public function getOrder() { // refers to the order in which the class' load function is called // (lower return values are called first) return 10; } public function load(ObjectManager $documentManager) { } } |
这个$documentManager对象将持久化这个document到PHPCR。但首先,你要创建一个新的document页面。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
use Doctrine\ODM\PHPCR\DocumentManager; use Symfony\Cmf\Bundle\SimpleCmsBundle\Doctrine\Phpcr\Page; // ... public function load(ObjectManager $documentManager) { if (!$documentManager instanceof DocumentManager) { $class = get_class($documentManager); throw new \RuntimeException("Fixture requires a PHPCR ODM DocumentManager instance, instance of '$class' given."); } $page = new Page(); // create a new Page object (document) $page->setName('new_page'); // the name of the node $page->setLabel('Another new Page'); $page->setTitle('Another new Page'); $page->setBody('I have added this page myself!'); } |
每个document都需要一个父元素,这个父元素应该是root节点。要做到这一点,我们首先要从PHPCR中获取root document,然后设置它作为父元素:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public function load(ObjectManager $documentManager) { if (!$documentManager instanceof DocumentManager) { $class = get_class($documentManager); throw new \RuntimeException("Fixture requires a PHPCR ODM DocumentManager instance, instance of '$class' given."); } // ... // get root document (/cms/simple) $simpleCmsRoot = $documentManager->find(null, '/cms/simple'); $page->setParentDocument($simpleCmsRoot); // set the parent to the root } |
最后,我们告诉Document管理使用Doctrine API去持久化我们的页面文档:
1 2 3 4 5 6 7 8 9 10 11 12 |
// ... public function load(ObjectManager $documentManager) { if (!$documentManager instanceof DocumentManager) { $class = get_class($documentManager); throw new \RuntimeException("Fixture requires a PHPCR ODM DocumentManager instance, instance of '$class' given."); } // ... $documentManager->persist($page); // add the Page in the queue $documentManager->flush(); // add the Page to PHPCR } |
现在你需要执行doctrine:phpcr:fixtures:load命令,然后你就能再次访问你的web页面了。你能够看到新添加的页面了:
如果你想知道更多关于symfony应用中如何使用PHPCR的请阅读”The Database Layer: PHPCR-ODM“
总结
PHPCR是很强大的方法在CMS中存储你的页面。但,如果你感到不舒服,你可以使用别的存储层http://symfony.com/doc/master/cmf/cookbook/database/choosing_storage_layer.html。
我们回顾这些已经20分钟了,你应该已经学会了如何使用一个新的存储层工作并添加了2个新页面。你看到你制作的应用程序在CMF中是如何简单的工作了吗?他提供的很多东西,在以前你可能都要自己完成。
但现在你只看到一个CMF的小部分,还有很多要学习的东西在等着你。在做这些所有事情之前,你要先了解CMF的主干:路由系统。在下一章你会了解更多关于他的信息。准备好另一个10分钟了吗?