diff --git a/composer.json b/composer.json index bf492bb..e3da687 100644 --- a/composer.json +++ b/composer.json @@ -18,6 +18,7 @@ "require": { "php": ">=5.3.3", "zendframework/zendframework": "dev-master", + "doctrine/common": "dev-master", "ensemble/utils": "dev-master" }, "autoload": { diff --git a/config/module.config.php b/config/module.config.php index 13bd32e..4b5e22e 100644 --- a/config/module.config.php +++ b/config/module.config.php @@ -44,7 +44,7 @@ /** * Class for page service */ - 'page_service_class' => '', + 'page_service_class' => 'Ensemble\Kernel\Service\Page', /** * Whether page parsing (routes + navigation) is enabled diff --git a/config/services.config.php b/config/services.config.php index e53a6be..22cc7d2 100644 --- a/config/services.config.php +++ b/config/services.config.php @@ -39,34 +39,41 @@ * @link http://ensemble.github.com */ +use Ensemble\Kernel\Exception; use Ensemble\Kernel\Listener; use Ensemble\Kernel\Parser; use Ensemble\Kernel\Service; -use Ensemble\Kernel\Exception; - return array( 'factories' => array( 'Ensemble\Kernel\Service\Page' => function ($sm) { - $config = $sm->get('config'); + $config = $sm->get('Config'); $config = $config['ensemble_kernel']; if (empty($config['page_service_class'])) { throw new Exception\PageServiceNotFoundException( - 'No service manager key provided for an service adapter' + 'No service manager key provided for a service adapter' ); } - $service = $sm->get($config['page_service_class']); + $pageMapper = $sm->get('Ensemble\Kernel\Mapper\Page'); + $serviceClass = $config['page_service_class']; + $service = new $serviceClass($pageMapper); - if (!$service instanceof Service\PageInterface) { + if (!$service instanceof Service\Page) { throw new Exception\PageServiceNotFoundException( - 'Instance of service adapter does not implement Ensemble\Kernel\Service\PageInterface' + 'Service is not an instance or subclass of Ensemble\Kernel\Service\Page' ); } return $service; }, + 'Ensemble\Kernel\Mapper\Page' => function () { + throw new Exception\PageMapperNotFoundException( + 'No mapper implementing Ensemble\Kernel\Mapper\PageInterface was found. Please use + Ensemble\KernelDoctrineOrm or implement your own mapper under this key' + ); + }, 'Ensemble\Kernel\Listener\DefaultListenerAggregate' => function ($sm) { - $config = $sm->get('configuration'); + $config = $sm->get('Config'); $config = $config['ensemble_kernel']; $listener = new Listener\DefaultListenerAggregate; @@ -148,7 +155,7 @@ return $listener; }, 'Ensemble\Kernel\Parser\Route' => function ($sm) { - $config = $sm->get('config'); + $config = $sm->get('Config'); $routes = $config['cmf_routes']; $parser = new Parser\Route; diff --git a/src/Kernel/Exception/PageMapperNotFoundException.php b/src/Kernel/Exception/PageMapperNotFoundException.php new file mode 100644 index 0000000..4b9f3b4 --- /dev/null +++ b/src/Kernel/Exception/PageMapperNotFoundException.php @@ -0,0 +1,46 @@ + + * @copyright 2012 Soflomo http://soflomo.com. + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @link http://ensemble.github.com + */ + +namespace Ensemble\Kernel\Exception; + +class PageMapperNotFoundException extends \RuntimeException +{ +} \ No newline at end of file diff --git a/src/Kernel/Mapper/PageInterface.php b/src/Kernel/Mapper/PageInterface.php new file mode 100644 index 0000000..e57a4a6 --- /dev/null +++ b/src/Kernel/Mapper/PageInterface.php @@ -0,0 +1,81 @@ + + * @copyright 2012 Soflomo http://soflomo.com. + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @link http://ensemble.github.com + */ + +namespace Ensemble\Kernel\Mapper; + +use Doctrine\Common\Persistence\ObjectRepository; +use Ensemble\Kernel\Model\PageInterface as PageModel; + +interface PageInterface extends ObjectRepository +{ + /** + * Persist a new page in the persistency layer + * + * @param PageModel $page Page to persist + * @return PageModel The persisted page + */ + public function persist(PageModel $page); + + /** + * Update an existing page + * + * @param PageModel $page Page to update + * @return PageModel The updated page + */ + public function update(PageModel $page); + + /** + * Delete a page + * + * @param PageModel $page Page to delete + * @return bool True if page is deleted + */ + public function delete(PageModel $page); + + /** + * Get all root nodes + * + * @param string|null $sortByField + * @param string $direction + * @return mixed + */ + public function getRootNodes($sortByField = null, $direction = 'ASC'); +} diff --git a/src/Kernel/Service/Page.php b/src/Kernel/Service/Page.php new file mode 100644 index 0000000..79c35c8 --- /dev/null +++ b/src/Kernel/Service/Page.php @@ -0,0 +1,125 @@ + + * @copyright 2012 Soflomo http://soflomo.com. + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @link http://ensemble.github.com + */ + +namespace Ensemble\Kernel\Service; + +use Ensemble\Kernel\Mapper\PageInterface as PageMapperInterface; +use Ensemble\Kernel\Model\PageCollection as PageCollectionModel; +use Ensemble\Kernel\Model\PageInterface as PageModel; + +/** + * Description of Page + */ +class Page +{ + /** + * @var PageMapperInterface + */ + protected $pageMapper; + + + /** + * Constructor + * + * @param PageMapperInterface $pageMapper + */ + public function __construct(PageMapperInterface $pageMapper) + { + $this->pageMapper = $pageMapper; + } + + /** + * Create a new page + * + * @param PageModel $page + * @return PageModel + */ + public function persist(PageModel $page) + { + return $this->pageMapper->persist($page); + } + + /** + * Update an existing page + * + * @param PageModel $page + * @return PageModel + */ + public function update(PageModel $page) + { + return $this->pageMapper->update($page); + } + + /** + * Delete an existing page + * + * @param PageModel $page + * @return bool + */ + public function delete(PageModel $page) + { + return $this->pageMapper->delete($page); + } + + /** + * Find page based on id + * + * @param int $id + * @return Page + */ + public function find($id) + { + return $this->pageMapper->find($id); + } + + /** + * Get the tree of pages + * + * @return PageCollectionModel + */ + public function getTree() + { + $pages = $this->pageMapper->getRootNodes('order', 'ASC'); + $collection = new PageCollectionModel($pages); + + return $collection; + } +} \ No newline at end of file