El CMF de Symfony2 necesita almacenar el contenido en algún lugar. Muchos de los paquetes proporcionan documentos y asignación para el contenido del repositorio PHP — Asignación para el objeto documento (PHPCR-ODM), y la documentación que actualmente está basada en torno a la utilización de este. No obstante, también debe ser posible utilizar cualquier otra forma de almacenamiento de contenido, tal como otro ORM/ODM o MongoDB.
El objetivo de esta guía es instalar y configurar Doctrine y el PHPCR-ODM, listo para que empieces con el CMF.
Para más detalles ve la documentación del PHPCR-ODM completa. Alguna información adicional se puede encontrar en la referencia del DoctrinePHPCRBundle, la cual mayoritariamente imita al DoctrineBundle estándar.
Finalmente para información sobre PHPCR ve al sitio web oficial de PHPCR.
Truco
Si sólo quieres usar el PHPCR pero no el PHPCR-ODM, puedes omitir el paso sobre el registro de anotaciones y las partes que empiezan con odm de la sección de configuración.
La primer cosa a decidir es qué repositorio de contenido utilizar. Un repositorio de contenido esencialmente es una base de datos que será la responsable para almacenar todo el contenido que quieras persistir. Este proporciona una API optimizada para las necesidades de un CMS (estructuras de árbol, referencias, versionado, completa búsqueda de texto, etc.). Si bien, cada repositorio de contenido puede tener requisitos y características de rendimiento muy diferentes, la API es igual para todos ellos.
Además, debido a que la API define un formato de importación/exportación, siempre puedes cambiar a una diferente implementación del repositorio de contenido más tarde.
Estas son las opciones disponibles:
La siguiente documentación incluye ejemplos para todas las opciones de arriba.
Truco
Si justo estás empezando con el CMF, es mejor escoger un repositorio de contenido basado en un motor de almacenamiento con el cual ya estés familiarizado. Por ejemplo, Jackalope con DBAL de Doctrine trabajará con tu RDBMS existente y no requiere instalar Java o la extensión midgard2 de PHP. Una vez que tienes una aplicación trabajando debe ser fácil cambiar a otra opción.
Añade lo siguiente a tu archivo composer.json, dependiendo del repositorio de contenido que hayas escogido.
"minimum-stability": "dev",
"require": {
...
"jackalope/jackalope-jackrabbit": "1.0.*",
"doctrine/phpcr-bundle": "1.0.*",
"doctrine/phpcr-odm": "1.0.*"
}
"minimum-stability": "dev",
"require": {
...
"jackalope/jackalope-doctrine-dbal": "dev-master",
"doctrine/phpcr-bundle": "1.0.*",
"doctrine/phpcr-odm": "1.0.*"
}
Midgard
"minimum-stability": "dev",
"require": {
...
"midgard/phpcr": "dev-master",
"doctrine/phpcr-bundle": "1.0.*",
"doctrine/phpcr-odm": "1.0.*"
}
Nota
Para todo lo anterior, si también estás utilizando el ORM de Doctrine, asegúrate de usar "doctrine/orm": "2.3.*", o de lo contrario composer no podrá resolver las dependencias cuando Doctrine dependa del PHPCR-ODM más nuevo de Doctrine 2.3. (la edición estándar de Symfony 2.1 utiliza «2.2.*».)
Para instalar las dependencias anteriores, ejecuta:
php composer.phar update
PHPCR-ODM usa anotaciones y es necesario registrarlas en tu archivo app/autoload.php. Añade la siguiente línea, inmediatamente después de la última línea AnnotationRegistry::registerFile:
// app/autoload.php
// ...
AnnotationRegistry::registerFile(__DIR__.'/../vendor/doctrine/phpcr-odm/lib/Doctrine/ODM/PHPCR/Mapping/Annotations/DoctrineAnnotations.php');
// ...
Luego, inicia los paquetes en el archivo app/AppKernel.php añadiéndolos al método registerBundle:
// app/AppKernel.php
public function registerBundles()
{
$bundles = array(
// ...
// Doctrine PHPCR
new Doctrine\Bundle\PHPCRBundle\DoctrinePHPCRBundle(),
);
// ...
}
El siguiente paso es configurar los paquetes.
La configuración básica para cada repositorio de contenido se muestra abajo; añade las líneas apropiadas a tu archivo app/config/config.yml. Puedes encontrar más información sobre la configuración de este paquete en el capítulo del DoctrinePHPCRBundle de la referencia.
Los parámetros del espacio de trabajo, nombre de usuario y contraseña son para el repositorio PHPCR y no los deberías confundir con las posibles credenciales de la base de datos. Estos provienen de la configuración de tu repositorio de contenido. Si quieres utilizar un diferente espacio de trabajo que «default» primero lo tienes que crear en tu repositorio.
Si también quieres utilizar el PHPCR-ODM, además, ve la siguiente sección.
Jackalope con Jackrabbit
# app/config/config.yml
doctrine_phpcr:
session:
backend:
type: jackrabbit
url: http://localhost:8080/server/
workspace: default
username: admin
password: admin
# configuración del odm ve abajo
Jackalope con DBAL de Doctrine
# app/config/config.yml
doctrine_phpcr:
session:
backend:
type: doctrinedbal
connection: doctrine.dbal.default_connection
workspace: default
username: admin
password: admin
# configuración del odm ve abajo
Nota
Además, asegúrate de configurar la sección principal de doctrine: al RDBMS que escogiste. Si quieres utilizar una diferente conexión en lugar de la predefinida, configúrala en la sección dbal y especifícala en el parámetro de conexión. Un ejemplo configuración típica es este:
- doctrine:
- dbal:
- driver: %database_driver% host: %database_host% port: %database_port% dbname: %database_name% user: %database_user% password: %database_password% charset: UTF8
Ve Bases de datos y Doctrine para más información.
Midgard
# app/config/config.yml
doctrine_phpcr:
session:
backend:
type: midgard2
db_type: MySQL
db_name: midgard2_test
db_host: "0.0.0.0"
db_port: 3306
db_username: ""
db_password: ""
db_init: true
blobdir: /tmp/cmf-blobs
workspace: default
username: admin
password: admin
# configuración del odm ve abajo
Cualquiera de las configuraciones anteriores te darán una sesión PHPCR válida. Si quieres utilizar el gestor Objeto-Documento, necesitas configurarlo también. Lo más sencillo es poner auto_mapping: true para hacer que el paquete PHPCR reconoce documentos en el directorio <Paquete>/Document y buscar asociaciones en <Paquete>/Resources/config/doctrine/<Document>.phpcr.xml resp. ...yml. De lo contrario necesitas configurar manualmente la sección de asignaciones. See the configuration reference of the PHPCR-ODM bundle for details.
# app/config/config.yml
doctrine_phpcr:
session:
...
odm:
auto_mapping: true
Jackalope Jackrabbit
Estos son los pasos necesarios para instalar Apache Jackrabbit:
java -jar jackrabbit-standalone-*.jar
Ve a http://localhost:8080/, ahora Apache te debería mostrar una página Jackrabbit.
Puedes encontrar más información sobre cómo ejecutar un servidor Jackrabbit en el wiki de Jackalope.
Jackalope DBAL de Doctrine
Ejecuta las siguientes órdenes para crear la base de datos e instalar un esquema predefinido:
app/console doctrine:database:create
app/console doctrine:phpcr:init:dbal
For more information on how to configure Doctrine DBAL with Symfony2, see the Doctrine chapter in the Symfony2 documentation and the explanations in the reference of the PHPCR-ODM bundle.
Midgard
Midgard es una extensión C que implementa la API de PHPCR en lo alto de un RDBMS estándar.
PHPCR-ODM utiliza un tipo de nodo personalizado para dar seguimiento a la metainformación sin interferir con tu contenido. There is a command that makes it trivial to register this type and the PHPCR namespace, as well as all base paths of bundles:
php app/console doctrine:phpcr:repository:init
El paquete proporciona la restricción de validación ValidPhpcrOdm que puedes utilizar para comprobar si los campos Id o Nodename y Parent de tu documento son correctos:
<?php
namespace Acme\DemoBundle\Document;
use Doctrine\ODM\PHPCR\Mapping\Annotations as PHPCRODM;
use Doctrine\Bundle\PHPCRBundle\Validator\Constraints as Assert;
/**
* @PHPCRODM\Document
* @Assert\ValidPhpcrOdm
*/
class MyDocument
{
/** @PHPCRODM\Id(strategy="parent") */
protected $id;
/** @PHPCRODM\Nodename */
protected $name;
/** @PHPCRODM\ParentDocument */
protected $parent;
...