The public API will give you an easy access to the eZ Publish content repository. This repository is the core component that manages content, locations (former Nodes), sections, content types (former Content Classes), user groups, users and roles. It also provides a new, clear interface for plugging in custom field types (former Datatypes).
The public API is built on top of a layered architecture including a new persistence layer for abstracting the storage functionality. By using the public API, your applications will be forward compatible with future releases based on enhanced,  scalable and high-performance storage engines. Applications based on the public API are also fully backwards compatible by using the included storage engine based on the current kernel and database model.

Receipt 1 - Setting up a sample commandline symfony bundle which uses the public API

This receipt shows how to setup a simple symfony bundle with a commandline script using the public API. The command is executable within the app/console and dumps a content object for a given content id.

Go to the eZ publish installation

cd <ezpublish installation root>

Generate a new Bundle

php app/console generate:bundle

Now follow the instructions. This will create a bundle eZ/Publish/Bundle/CookBookBundle in the src directory of the installation root.




  Welcome to the Symfony2 bundle generator  

Your application code must be written in bundles. This command helps
you generate them easily.

Each bundle is hosted under a namespace (like Acme/Bundle/BlogBundle).
The namespace should begin with a "vendor" name like your company name, your
project name, or your client name, followed by one or more optional category
sub-namespaces, and it should end with the bundle name itself
(which must have Bundle as a suffix).

See for more
details on bundle naming conventions.

Use / instead of \  for the namespace delimiter to avoid any problem.

Bundle namespace: eZ/Publish/Bundles/CookbookBundle

In your code, a bundle is often referenced by its name. It can be the
concatenation of all namespace parts but it's really up to you to come
up with a unique name (a good practice is to start with the vendor name).
Based on the namespace, we suggest eZPublishBundlesCookbookBundle.

Bundle name [eZPublishBundlesCookbookBundle]: 

The bundle can be generated anywhere. The suggested default directory uses
the standard conventions.

Target directory [.../ezpublish5/src]: 

Determine the format to use for the generated configuration.

Configuration format (yml, xml, php, or annotation) [annotation]: yml

To help you get started faster, the command can generate some
code snippets for you.

Do you want to generate the whole directory structure [no]? yes

  Summary before generation  

You are going to generate a "eZ\Publish\Bundles\CookbookBundle\eZPublishBundlesCookBookBundle" bundle
in ".../ezpublish5/src/" using the "yml" format.

Do you confirm generation [yes]? yes

  Bundle generation  

Generating the bundle code: OK
Checking that the bundle is autoloaded: OK
Confirm automatic update of your Kernel [yes]? yes  
Enabling the bundle inside the Kernel: OK
Confirm automatic update of the Routing [yes]? yes
Importing the bundle routing resource: OK

  You can now start using the generated code!  




Add a Command directory to the bundle

cd <ezpublish installation root>/eZ/Publish/Bundle/CookbookBundle

mkdir Command

add the following class file CookbookCommand.php in the directory Command


 * File containing the CookBookCommand class.
 * @copyright Copyright (C) 2012 eZ Systems AS. All rights reserved.
 * @license GNU General Public License v2
 * @version //autogentag//
namespace eZ\Publish\Bundles\CookBookBundle\Command;

use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputOption;

class CookBookCommand extends ContainerAwareCommand
     * This method override configures on input argument for the content id
    protected function configure()
        $this->setName( 'cookbook:run' )->setDefinition(
                new InputArgument( 'contentId', InputArgument::REQUIRED, 'An existing content id' )

     * execute the command
     * @param InputInterface $input
     * @param OutputInterface $output
    protected function execute( InputInterface $input, OutputInterface $output )
        // fetch the input argument
        $contentId = $input->getArgument( 'contentId' );

        // get the repository from the di container
        $repository = $this->getContainer()->get( 'ezpublish.api.repository' );

        // get the content service from the repsitory
        $contentService = $repository->getContentService();

            // print out the content info for the gicen content id
            print_r( $contentService->loadContentInfo( $contentId ) );
        catch( \eZ\Publish\API\Repository\Exceptions\NotFoundException $e )
            // if the id is not found
            $output->writeln( "No content with id $contentId" );
        catch( \eZ\Publish\API\Repository\Exceptions\UnauthorizedException $e )
            // not allowed to read this content
            $output->writeln( "Anonymous users are not allowed to read content with id $contentId" );


run f.e.

php app/console cookbook:run  57


Receipt 2  Creating a content type group

This snippet creates a content type group for a given identifier


        $contentTypeService = $repository->getContentTypeService();
            // instanciate a create struct
            $groupCreate = $this->contentTypeService->newContentTypeGroupCreateStruct($groupIdentifier);
            // call service method
            $contentTypeGroup =  $this->contentTypeService->createContentTypeGroup( $groupCreate );
            // print out the group
        catch( \eZ\Publish\API\Repository\Exceptions\UnauthorizedException $e )
            // react on permission denied
        catch( \eZ\Publish\API\Repository\Exceptions\ForbiddenException $e )
            // react on identifier already exists

If this snipped is run with the same init code from receipt 1 we will get an UnauthorizedException.

The solution is described in the next receipt.

Receipt 3 - Setting the user for authorizing actions

By default the repository assumes the anonymous user is acting. To change this the following code can be executed

        // get the user service from the repository
		$userService = $repository->getUserService();
        // load user by credentials
        $user = $userService->loadUserByCredentials($user,$password);
        // set user in repository

If the user is identified by other mechanisms the user also can be loaded by its id.