Symfony

31 entradas

Symfony: Doctrine: persistir datos bidireccionalmente en una relación ManyToMany

Este es un pequeño HOWTO para tener de referencia. Si tienes una relación entre dos entidades de la forma ManyToMany, una de ellas tendrá inversedBy y la otra mappedBy. Con un ejemplo se ve más claro. Suponiendo que has generado las acciones CRUD con el comando siguiente: $ php app/console doctrine:generate:crud  Supongamos que tenemos usuarios y negocios relacionados así, en una relación muchos a muchos. En la entidad Business tenemos:/** * @ORMManyToMany(targetEntity=”User”,  * inversedBy=”users”, cascade={“persist”}) */private $users; Y en la entidad User tenemos: /** * @ORMManyToMany(targetEntity=”Business”,  * mappedBy=”users”, cascade={“persist”}) * @ORMJoinColumn(onDelete=”SET NULL”) */private $businesses;Ahora el editar los usuarios tenemos en el formulario de edición de un usuario lo siguiente: ->add(‘businesses’, ‘entity’, array(    ‘by_reference’ => false,    //..))La entidad inversedBy, que en este caso es Business, guardará correctamente los Users referenciados al editarlos. Pero al contrario con la entidad Users, tiene los Business mapeados, lo que hará que no guarde automáticamente las referencias. Hay que añadir lo que he puesto en negrita en los códigos anteriores y en la entidad User lo siguiente para permitir que añada y borre los Business correctamente. /** * Add businesses. * * @param AppBundleEntityBusiness $businesses * * @return User */public function addBusiness(AppBundleEntityBusiness $business){    $this->businesses[] = $business;    $business->addUser($this);     return $this;} /** * Remove businesses. * * @param AppBundleEntityBusiness $businesses */public function removeBusiness(AppBundleEntityBusiness $business){    $this->businesses->removeElement($business);    […]

Sylius.org tienda online 100% Symfony: calidad, flexibilidad y escalabilidad

Brutal el proyecto que están desarrollando en Sylius. Navegando y navegando por proyectos para hacer tiendas online. Viendo las principales opciones del mercado: Magento, Prestashop y WordPress con WooCommerce. Me planteaba la opción de cómo sería desarrollar una tienda completa en Symfony. Integrar pasarelas de pago, métodos de envío, ordenando todo los productos por categorías, valores, atributos de los productos.. es un trabajazo. Pero por otro lado no quería prescindir de la flexibilidad y agilidad que nos da un buen framework PHP, en este caso el gran Symfony. Aterrizaje Todas estas búsquedas me llevaron a encontrar Sylius. Lo que hasta ahora es el proyecto de tienda online basado en Symfony que me ha parecido más interesante. A fecha en que escribo está en fase de desarrollo aunque hay quien ya lo está utilizando. Aquí el repositorio público de la aplicación web:https://github.com/Sylius/Sylius Página principal del proyecto:http://sylius.org/ Se trata de un proyecto Open Source, licenciado bajo la MIT license. Esto nos permite usar Sylius para cualquier proyecto, libremente sin coste de compra ninguno. Lo único que no se pude hacer es decir que Sylius lo hemos hecho nosotros, como es lógico. Se puede adaptar, modificar, ampliar, etc.. Cualquier cosa se puede hacer […]

Symfony i18n: internacionalización de la web, entrada a la web

Puede ser algo trivial, pero es el punto de partida para iniciar la internacionalización de una web. Me refiero a la llegada del usuario, recogida del código de idioma y región del navegador, se comprueban los idiomas disponibles y posteriormente se le redirige a la página de su idioma correspondiente. Es mucho más sencillo que lo que puede parecer a priori, pero claro está, hay que tener claras un par de cosas que si no después se complica. El usuario llega a la web En este punto, tenemos un usuario que llega a la web. Ahora es el momento de elegir el idioma en que le vamos a mostrar la página web al usuario. Que podemos hacerlo de dos formas diferentes: eligiendo el idioma por defecto o con el idioma que nos sugiera el navegador. Vamos a empezar con un ejemplo de controlador que recibe la visita inicial del usuario: <?phpnamespace FrontBundleController; use SymfonyBundleFrameworkBundleControllerController;use SensioBundleFrameworkExtraBundleConfigurationRoute;use SensioBundleFrameworkExtraBundleConfigurationTemplate;use SymfonyComponentHttpFoundationRequest;/* * Controlador de ejemplo para empezar a traducir una web. * Sólo tiene las dos rutas necesarias para empezar la navegación traducida * Se necesita de la entidad Idioma para tener los idiomas disponibles. */class DefaultController extends Controller{    /**     * Esta ruta es la página de inicio. […]

El Picaporte Alicante

Quiero presentar aquí uno de mis últimos trabajos. Se trata de una web totalmente artesanal, con una parte frontal visible, y dos paneles de administración. Se trata de la presencia online de la conocida empresa El Picaporte Alicante, que trabaja con productos de muy alta calidad y exquisitos diseños. La web: https://elpicaportealicante.es/Facebook: https://facebook.com/ElPicaporteALCTwitter: https://twitter.com/elpicaporteALCInstagram: https://instagram.com/elpicaportealicante/ Cómo esta hecho Por motivos varios, y principalmente, para conseguir la mayor flexibilidad y la mejor de todas las calidades se decidió por un sistema hecho a medida para la empresa. Por esto se desarrolló un sistema desde cero usando de las mejores herramientas para desarrollo de aplicaciones web que existen: Symfony, Bootstrap, jQuery, Linux, MariaDB y desplegado sobre la mayor granja de servidores que existe a fecha de hoy, Amazon Web Services. Características Tenemos en la zona principal, después de la página splash de inicio, directamente el catálogo de productos. Dicho catálogo es navegable por categorías hasta los productos. Se adapta a dispositivos móviles reordenando las zonas en la pantalla. Aquí también tenemos un formulario de contacto con el que se recibe el mensaje en el email de la empresa, además de la información legal y otros datos de contacto. A la par, tenemos […]

Creando nuevo proyecto Symfony

Cada vez viene siendo más sencillo programar con Symfony. Con la última versión 2.7 LTS leo que tenemos un sencillo programa de línea de comando que nos hace aún más rápido el comenzar un nuevo proyecto. Simplemente ejecutando lo que se ve en la imagen te creará la estructura básica de un nuevo proyecto con la última versión del framework listo para empezar a crear los bundles, las entidades, CRUDs, o lo que necesitemos. No hay más que ejecutar desde el directorio donde lo queramos lo siguiente: $ symfony new nombreProyecto Para instalarlo me remito a la documentación oficial:http://symfony.com/download No puedo enlazarlo así que os dejo aquí las instrucciones. En Linux o Mac ponemos lo siguiente: $ sudo curl -LsS http://symfony.com/installer -o /usr/local/bin/symfony $ sudo chmod a+x /usr/local/bin/symfony  En Windows lo siguiente: c:> php -r “readfile(‘http://symfony.com/installer’);” > symfony  Me despido recomendando una vez más a todos los programadores web a seguir aprendiendo frameworks. Seamos productivos utilizándolos, en mi caso ha sido una buena inversión de tiempo. Y ahora que miro atrás en cómo se hacen los desarrollos web sin frameworks, o con frameworks.. Veo cada día más claro que con tanto CMS el futuro de los desarrolladores web está en […]

Me preocupa el despliegue contínuo, fijando versiones en composer.json (editado)

¿Qué pasa si tienes un proyecto con librerías gestionadas con #Composer y le has puesto muchas de ellas que se actualicen a la última versión disponible? Para mantener el programa actualizado, beneficiándote de las últimas mejoras de cada librería, era una buena solución. Poner todo a la versión ‘dev-master’. Jeje, todo va bien mientras estás desarrollando.. De vez en cuando alguna función ‘deprecated’ deja de existir porque definitivamente la eliminaron. Nuevas funciones o propiedades que podemos usar. La aplicación funciona cada vez mejor pero sabes que no hay otra que fijar las versiones si no cuando pasemos a producción es un riesgo que se actualice automáticamente y zas! dejó de funcionar. Así que hay que buscar la versión que tenemos instalada de cada paquete y fijarlas. Puede que tengamos un composer.json parecido a éste, con muchos ~ * @dev dev-master >= etcétera: “requiere” : { “php” : “>=5.3.3”, “symfony/symfony” : “2.5.*”, “doctrine/orm” : “~2.2,>=2.2.3”, “doctrine/doctrine-bundle” : “~1.2”, “twig/extensions” : “~1.0”, “symfony/assetic-bundle” : “~2.3”, “symfony/swiftmailer-bundle” : “~2.3”, “symfony/monolog-bundle” : “~2.4”, “sensio/distribution-bundle” : “~3.0”, “sensio/framework-extra-bundle” : “~3.0”, “incenteev/composer-parameter-handler” : “~2.0”, “sensio/generator-bundle” : “~2.3”, “mopa/bootstrap-bundle” : “dev-master”, “twbs/bootstrap” : “dev-master”, “knplabs/knp-paginator-bundle” : “dev-master”, “knplabs/knp-menu-bundle” : “dev-master”, “knplabs/knp-menu” : “2.0.*@dev”, “craue/formflow-bundle” : “dev-master”, “friendsofsymfony/user-bundle” […]

Hola mundo Silex usando Composer

Estoy ahora curioseando los entresijos de PHP. Viendo hacia dónde tiende la programación en la web. Añadiendo herramientas, librerías de programación para mis proyectos. Dentro del mundo de la programación, elegir librerías, actualizarlas, combinarlas.. todo esto lleva trabajo y en los últimos años están apareciendo herramientas que nos facilitan la vida. Pongámonos en situación Cuando empezamos a programar con PHP. Desde el inicio hasta hace pocos años, que casi todo se hacía a pelo. PHP puro y duro, añadiendo código y más código. Los programas iban creciendo y creciendo. Se iban añadiendo manualmente librerías para todo tipo de tareas. Ahora ya no tenemos que reinventar la rueda. Estan surgiendo librerías públicas como por ejemplo  Packagist, donde se recopilan códigos para hacer todo tipo de tareas con PHP. Para manejo de Packagist tenemos una herramienta llamada Composer, con la que una vez configurado lo que vamos a necesitar Composer se encarga de conectar a Packagist y descargar los ficheros que haga falta. Para la programación front-end tenemos herramientas como Bower, similar a Composer, pero pensado para gestionar librerías Javascript/CSS. Estas herramientas, una vez configuradas, nos descargarán los ficheros a nuestro directorio de trabajo y listo. Ya tendremos nuestro proyecto para programar, […]