ez publish nextgen
DESCRIPTION
Any piece of software can only be as good as its foundations. To rise as high as we need it to, we decided eZ Publish needed new ones. Today, we will tell you how these are architectured, and give you a glimpse of their possibilities.TRANSCRIPT
![Page 1: eZ Publish nextgen](https://reader034.vdocuments.site/reader034/viewer/2022052618/554a27abb4c90520578b4a7d/html5/thumbnails/1.jpg)
eZ Publish NextgenKnock knock. Who’s there ? The Future !
samedi 15 octobre 11
![Page 2: eZ Publish nextgen](https://reader034.vdocuments.site/reader034/viewer/2022052618/554a27abb4c90520578b4a7d/html5/thumbnails/2.jpg)
Current architectureWhat’s wrong with it ? Why ?
samedi 15 octobre 11
![Page 3: eZ Publish nextgen](https://reader034.vdocuments.site/reader034/viewer/2022052618/554a27abb4c90520578b4a7d/html5/thumbnails/3.jpg)
Current architecture
samedi 15 octobre 11
![Page 4: eZ Publish nextgen](https://reader034.vdocuments.site/reader034/viewer/2022052618/554a27abb4c90520578b4a7d/html5/thumbnails/4.jpg)
• RDBMS dependent, and strongly bound to the database structure• PHP 4 ages legacy :
o Weak OOP concepts (no interfaces, no abstract, no excepGons, no magic, no dependency injecGon, everything is public)
o Global variables usage (for singletons on in-‐memory cache)o (And also some dirty workarounds)
• Low level APIo Hard to catcho SomeGmes dangerous to manipulate directly (for data integrity)o No real API doc, hence no developer doc
• Hardly testable
Current architecture
samedi 15 octobre 11
![Page 5: eZ Publish nextgen](https://reader034.vdocuments.site/reader034/viewer/2022052618/554a27abb4c90520578b4a7d/html5/thumbnails/5.jpg)
• Evolu'ons are very 'me-‐consuming• Maintaining backward compa'bility is very complex• No possible support for NoSQL• Impossible to perform RDBMS specific op'miza'ons
(na've func'ons and procedures, like in Oracle, or even latest MySQL)
• Bad API usage (and "Black Magic")
Consequences
samedi 15 octobre 11
![Page 6: eZ Publish nextgen](https://reader034.vdocuments.site/reader034/viewer/2022052618/554a27abb4c90520578b4a7d/html5/thumbnails/6.jpg)
New architecture«This is a revoluGon» © S.J.
samedi 15 octobre 11
![Page 7: eZ Publish nextgen](https://reader034.vdocuments.site/reader034/viewer/2022052618/554a27abb4c90520578b4a7d/html5/thumbnails/7.jpg)
Layers...
samedi 15 octobre 11
![Page 8: eZ Publish nextgen](https://reader034.vdocuments.site/reader034/viewer/2022052618/554a27abb4c90520578b4a7d/html5/thumbnails/8.jpg)
• Kicked off with Domain Driven Design methodologies• Storage system agnos'c• Extensible• Secure• Easy to use• Modern (PHP 5.3, namespaces, design paUerns...)
New architecture overview
samedi 15 octobre 11
![Page 9: eZ Publish nextgen](https://reader034.vdocuments.site/reader034/viewer/2022052618/554a27abb4c90520578b4a7d/html5/thumbnails/9.jpg)
samedi 15 octobre 11
![Page 10: eZ Publish nextgen](https://reader034.vdocuments.site/reader034/viewer/2022052618/554a27abb4c90520578b4a7d/html5/thumbnails/10.jpg)
The refined domain defini'on comes up with new terms:
Content Object Content
Node Loca/on
Content Object A1ribute Field
Content Class Content Type
Content Class A1ribute Field Defini/on
Datatype Field Type
Easier to understand for newcomers and non-‐technical people (Domain design approach)
Do you speak eZ Publish ?
samedi 15 octobre 11
![Page 11: eZ Publish nextgen](https://reader034.vdocuments.site/reader034/viewer/2022052618/554a27abb4c90520578b4a7d/html5/thumbnails/11.jpg)
• Public API is the ONLY API any developer should use directly
• Any developer = eZ Engineers included (kernel modules)
• Should be sexy and very easy to use
• High level, so that the developer doesn't care about the backend
• It interacts seamlessly with the business layer in the backend
Public API
samedi 15 octobre 11
![Page 12: eZ Publish nextgen](https://reader034.vdocuments.site/reader034/viewer/2022052618/554a27abb4c90520578b4a7d/html5/thumbnails/12.jpg)
• This is the layer where most of the logic is implemented
• It is completely storage agnos/c, as it uses the content persistence API.
• It uses the Content Repository to manipulate the CMS data.
• It doesn't delegate logic to the content persistence API.
Business layer
samedi 15 octobre 11
![Page 13: eZ Publish nextgen](https://reader034.vdocuments.site/reader034/viewer/2022052618/554a27abb4c90520578b4a7d/html5/thumbnails/13.jpg)
• Starts as a set of interfaces.
• These interfaces are implemented by every content repositories (aka Storage Engines).
• Ensures full abstrac/on between the business layer and the storage mechanisms.
• Contains as liUle logic as possible. It cares about data, only data. Logic is in the business layer.
Persistence layer
samedi 15 octobre 11
![Page 14: eZ Publish nextgen](https://reader034.vdocuments.site/reader034/viewer/2022052618/554a27abb4c90520578b4a7d/html5/thumbnails/14.jpg)
• Storage engines implement the Content Persistence Interfaces
• Each storage engine corresponds to a type of data storageo Classic RDBMS (MySQL, PostgreSQL...)o Document oriented storage (NoSQL)o ...
• Internals are completely hidden, and can use anything: ORM, ezcDatabase, REST, SOAP...
Storage engines
samedi 15 octobre 11
![Page 15: eZ Publish nextgen](https://reader034.vdocuments.site/reader034/viewer/2022052618/554a27abb4c90520578b4a7d/html5/thumbnails/15.jpg)
New, fancy terms
• Repository: Centralized, virtual storage system. Implemented by storage. Also used for binary files.
• Domain Object (aka DO): High level PHP object exposed in public API: Content, Loca'on, Field, etc.
• Service: Interac'on components from the Business Layer: Content, Loca'on, etc.
Do you speak eZ Publish ?
samedi 15 octobre 11
![Page 16: eZ Publish nextgen](https://reader034.vdocuments.site/reader034/viewer/2022052618/554a27abb4c90520578b4a7d/html5/thumbnails/16.jpg)
• eZ Publish 4 database Persistence Layer implementa'on
• Implemented from scratch. Shiny !
• Uses the Zeta Components (ezcDatabase + ezcQuery)
• Tested to be two-‐ways compa/ble with eZ Publish 4:➡ content created from ezp4 is available in the API➡ content created from the API is available in ezp4
• No migra/on required !
Legacy Storage Engine
samedi 15 octobre 11
![Page 17: eZ Publish nextgen](https://reader034.vdocuments.site/reader034/viewer/2022052618/554a27abb4c90520578b4a7d/html5/thumbnails/17.jpg)
Code !That’s why we’re here, right ?
samedi 15 octobre 11
![Page 18: eZ Publish nextgen](https://reader034.vdocuments.site/reader034/viewer/2022052618/554a27abb4c90520578b4a7d/html5/thumbnails/18.jpg)
samedi 15 octobre 11
![Page 19: eZ Publish nextgen](https://reader034.vdocuments.site/reader034/viewer/2022052618/554a27abb4c90520578b4a7d/html5/thumbnails/19.jpg)
<?phpuse ezp\Base\ServiceContainer, ezp\Base\Configuration, ezp\Content\FieldType\Url;
// Get the repository, and configure the user to use$sc = new ServiceContainer( Configuration::getInstance( 'service' )->getAll() );$repository = $sc->getRepository();$contentService = $repository->getContentService();$repository->setUser( $repository->getUserService()->load( 14 ) );
// Build a new folder// $folder will be a DO, ezp\Content$folder = $contentService->init( 'folder', 'eng-GB' );$folder->fields['name'] = 'News';$folder->fields['description'] = '<p>My <strong>ubber cool</strong> description !</p>';$folder->fields['link'] = new Url\Value( 'http://ez.no', 'eZ Systems' );$folder->addParent( $repository->getLocationService()->load( 2 ) );$folder = $contentService->create( $folder );$contentService->publish( $folder->versions[1] );
Create content
samedi 15 octobre 11
![Page 20: eZ Publish nextgen](https://reader034.vdocuments.site/reader034/viewer/2022052618/554a27abb4c90520578b4a7d/html5/thumbnails/20.jpg)
<?phpuse ezp\Base\ServiceContainer, ezp\Base\Configuration;
$sc = new ServiceContainer( Configuration::getInstance( 'service' )->getAll() );$repository = $sc->getRepository();$contentService = $repository->getContentService();try{ $content = $contentService->load( 60 );}catch ( ezp\Base\Exception\NotFound $e ){ echo "Content could not be found in the repository !\n"; exit;}
// Loop against fields.// $identifier is the attribute identifier// $value is the corresponding value objectecho "Content '{$content}' has following fields:\n";foreach ( $content->fields as $identifier => $value ){ echo "Field '{$identifier}': {$value}\n"; // Using $value __toString()}
Load content
samedi 15 octobre 11
![Page 21: eZ Publish nextgen](https://reader034.vdocuments.site/reader034/viewer/2022052618/554a27abb4c90520578b4a7d/html5/thumbnails/21.jpg)
<?phpuse ezp\Base\ServiceContainer, ezp\Base\Configuration, ezp\Content, ezp\Content\Query;
$sc = new ServiceContainer( Configuration::getInstance( 'service' )->getAll() );$qb = new ezp\Content\Query\Builder;$contentService = $sc->getRepository()->getContentService();
// a full criteria$qb->addCriteria( $qb->fullText->like( 'eZ Publish' ), $qb->urlAlias->like( '/cms/amazing/*' ), $qb->contentType->eq( 'blog_post' ), $qb->field->eq( 'author', '[email protected]' ))->addSortClause( $qb->sort->field( 'blog_post', 'title', Query::SORT_ASC ), $qb->sort->dateCreated( Query::SORT_DESC ))->setOffset( 0 )->setLimit( 10 );$contentList = $contentService->find( $qb->getQuery() );
Fetch content
samedi 15 octobre 11
![Page 22: eZ Publish nextgen](https://reader034.vdocuments.site/reader034/viewer/2022052618/554a27abb4c90520578b4a7d/html5/thumbnails/22.jpg)
Field types
• Now spliUed in (at least) 2 objects:• Type• Value
• Dedicated PHP namespace
• Interfaces to determine which features the field type implement (Searchable, Collectable...)
• Converters for Legacy storage engine
samedi 15 octobre 11
![Page 23: eZ Publish nextgen](https://reader034.vdocuments.site/reader034/viewer/2022052618/554a27abb4c90520578b4a7d/html5/thumbnails/23.jpg)
• Full language/transla'on support
• Finish migra'ng datatypes
• HTTP layer + modules
• REST API implementa'on based on the new API
• Op'mized storage engines
Roadmap
samedi 15 octobre 11
![Page 24: eZ Publish nextgen](https://reader034.vdocuments.site/reader034/viewer/2022052618/554a27abb4c90520578b4a7d/html5/thumbnails/24.jpg)
•Get it : http://github.com/ezsystems/ezp-next
•Blame it : http://issues.ez.no/ezpublish (ezpnext component)
•Discuss it : http://share.ez.no/forums/new-php-api
•Own it : Make a GitHub pull request !
Soon to come: wiki based cookbook, blog posts.
Now it’s your turn !
samedi 15 octobre 11