Download - eZ Publish nextgen
eZ Publish NextgenKnock knock. Who’s there ? The Future !
samedi 15 octobre 11
Current architectureWhat’s wrong with it ? Why ?
samedi 15 octobre 11
Current architecture
samedi 15 octobre 11
• 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
• 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
New architecture«This is a revoluGon» © S.J.
samedi 15 octobre 11
Layers...
samedi 15 octobre 11
• 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
samedi 15 octobre 11
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
• 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
• 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
• 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
• 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
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
• 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
Code !That’s why we’re here, right ?
samedi 15 octobre 11
samedi 15 octobre 11
<?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
<?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
<?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
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
• 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
•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