from new class and dependency injection to PSR-11 and Auto-wiringMilad Arabi
ارئه من تو کدرکانف3 که هدف اصلیم توضیح مفاهیم زیر است:
Inversion of control
Dependency injection
Constructor injection
Property injection
Setter injection
Interface/trait injection
Dependency inversion principle
Dependency injection container
Service locator
Javascript per applicazioni complesse - Lo Stretto digitaleGiuseppe Pizzimenti
Mentre ogni giorno di più crescono e si fanno sempre più complessi gli ambiti nei quali Javascript si propone (e spesso impone) come strumento di sviluppo, viene da chiedersi se (e quando) si avvererà la legge di Atwood per la quale "ogni applicazione che può essere scritta in Javascript, sarà necessariamente scritta in Javascript".
Nell'attesa di scoprirlo meglio prepararsi con vecchi e nuovi patterns e best practices che ci consentono di realizzare software di qualità con uno dei linguaggi più duttili e trasversali di sempre.
Presentazione realizzata nell'ambito del progetto "Lo Stretto Digitale"
FOSUserBundle is a Symfony bundle that provides user management and authentication functionality. It simplifies storing users in a database by building on Symfony's security framework. To use it, install the bundle, configure security and routing, and extend the base User class for the user entity. This allows adding user registration, profile, password reset and other security features to a Symfony application.
jQuery es una biblioteca JavaScript que simplifica la manipulación del DOM, el manejo de eventos y las solicitudes AJAX. jQuery selecciona elementos del DOM usando selectores y provee métodos para modificar el contenido, estilo y comportamiento de los elementos. jQuery también facilita la vinculación de funciones a eventos como clicks y el movimiento del mouse sobre elementos.
from new class and dependency injection to PSR-11 and Auto-wiringMilad Arabi
ارئه من تو کدرکانف3 که هدف اصلیم توضیح مفاهیم زیر است:
Inversion of control
Dependency injection
Constructor injection
Property injection
Setter injection
Interface/trait injection
Dependency inversion principle
Dependency injection container
Service locator
Javascript per applicazioni complesse - Lo Stretto digitaleGiuseppe Pizzimenti
Mentre ogni giorno di più crescono e si fanno sempre più complessi gli ambiti nei quali Javascript si propone (e spesso impone) come strumento di sviluppo, viene da chiedersi se (e quando) si avvererà la legge di Atwood per la quale "ogni applicazione che può essere scritta in Javascript, sarà necessariamente scritta in Javascript".
Nell'attesa di scoprirlo meglio prepararsi con vecchi e nuovi patterns e best practices che ci consentono di realizzare software di qualità con uno dei linguaggi più duttili e trasversali di sempre.
Presentazione realizzata nell'ambito del progetto "Lo Stretto Digitale"
FOSUserBundle is a Symfony bundle that provides user management and authentication functionality. It simplifies storing users in a database by building on Symfony's security framework. To use it, install the bundle, configure security and routing, and extend the base User class for the user entity. This allows adding user registration, profile, password reset and other security features to a Symfony application.
jQuery es una biblioteca JavaScript que simplifica la manipulación del DOM, el manejo de eventos y las solicitudes AJAX. jQuery selecciona elementos del DOM usando selectores y provee métodos para modificar el contenido, estilo y comportamiento de los elementos. jQuery también facilita la vinculación de funciones a eventos como clicks y el movimiento del mouse sobre elementos.
Este documento resume cuatro bundles útiles para Symfony: SonataBundle, JsRoutingBundle, DoctrineFixturesBundle. Explica cómo instalar y configurar cada uno, así como sus principales características como generar interfaces de administración con SonataBundle, exponer rutas para su uso en JavaScript con JsRoutingBundle, y cargar datos de prueba con DoctrineFixturesBundle.
Este documento describe los pasos para implementar la seguridad en una aplicación Symfony, incluyendo autenticación HTTP, control de acceso y autorización. Explica cómo configurar el cortafuegos para autenticar usuarios y proteger rutas, y cómo usar roles para autorizar el acceso a recursos.
Este documento describe cómo personalizar los fragmentos de formularios en Symfony. Explica que cada parte de un formulario (etiquetas, campos, errores) está representada por un bloque o plantilla. Para personalizar una parte, basta con reemplazar el bloque o plantilla correspondiente. También cubre temas como heredar fragmentos y aplicar personalizaciones globalmente a través de la configuración.
Este documento describe la validación de datos en Symfony2. Symfony2 incluye un componente Validator que facilita la validación de datos antes de guardarlos en una base de datos o pasarlos a un servicio web. Se pueden definir restricciones como NotBlank y Email en las propiedades de una entidad para validar los datos. El servicio validator puede utilizarse para validar objetos y valores individuales y devolver errores. También es posible crear restricciones personalizadas.
1) Los formularios permiten enviar datos desde el cliente al servidor. Symfony proporciona un componente de formularios que facilita su creación. 2) Se construye un formulario mediante un generador que añade campos vinculados a las propiedades de una entidad. 3) El formulario vincula los datos enviados a la entidad y la valida antes de procesarla.
Este documento describe cómo manejar archivos subidos con Doctrine en Symfony. Explica cómo configurar las propiedades de la entidad para almacenar la ruta del archivo, y cómo integrar la carga y eliminación de archivos en el ciclo de vida de la entidad usando callbacks. También cubre cómo manejar el archivo subido en el controlador y la plantilla, y generar nombres de archivo únicos antes de persistir la entidad.
Twig es un motor de plantillas que proporciona una sintaxis simple para generar documentos de texto. Ofrece características como herencia de plantillas, bloques, filtros y bucles. Twig compila las plantillas a clases PHP para un rendimiento óptimo. Las plantillas se almacenan en directorios y se vinculan a controladores mediante nombres de ruta de paquete.
1) Un controlador es una función PHP que maneja las peticiones HTTP y devuelve una respuesta. 2) El controlador contiene la lógica para crear el contenido de una página y devuelve un objeto Response. 3) Las rutas asignan URLs a controladores específicos para procesar las peticiones.
1. El documento describe el sistema de enrutado de Symfony, el cual mapea URLs a controladores de manera flexible y configurable.
2. Las rutas se definen en archivos YAML o mediante anotaciones y mapean patrones de URL a controladores de acción.
3. El sistema de enrutado permite agregar parámetros, requisitos y nombres a las rutas para una configuración avanzada.
Este documento proporciona una guía para instalar y configurar Symfony2. Explica cómo crear páginas mediante rutas, controladores y plantillas, y recomienda instalar XAMPP y Composer para configurar el entorno de desarrollo de Symfony2 en local. También describe la estructura básica de directorios de un proyecto Symfony2 y un bundle.
SensioLabsDesktop es una aplicación de escritorio que facilita la gestión de proyectos PHP en Linux, Windows y Mac, permitiendo administrar dependencias con Composer, ejecutar comandos de Symfony y PHPUnit sin usar la línea de comandos, y pronto proporcionará funciones como revisar registros web en tiempo real y recibir notificaciones de nuevas versiones de bibliotecas.
El documento explica los conceptos fundamentales de HTTP y cómo funcionan las peticiones y respuestas. Describe los verbos HTTP más comunes como GET, POST, PUT y DELETE. Explica cómo Symfony maneja peticiones y respuestas utilizando objetos Request y Response respectivamente. También resume el flujo básico de una aplicación Symfony donde el enrutamiento determina qué controlador se ejecuta en respuesta a una petición.
Este documento presenta Symfony 2, un framework PHP para el desarrollo de aplicaciones web. Describe un caso de éxito de una gran empresa que usa Symfony 2 para manejar más de 135 millones de usuarios y 300,000 consultas por segundo en su sitio, el cual recibe 200 millones de páginas por día. También incluye una lista de las tecnologías clave utilizadas como PHP-FPM, HAProxy, ActiveMQ, Varnish, Redis, Nginx, MySQL y Symfony2. Finalmente, menciona que Drupal 8 usa
1. El Modelo - Doctrine
Realizada por:
Christian Aquino |@cj_aquino
Diego Ramirez |@thedarsideofit
Para: Hydras C&S |@hydras_cs
Basada en Libro Symfony 2 en español Nacho Pacheco y The Book
3. Creando nuestra primer Entidad
//
src/Acme/StoreBundle/Entity/Produ
ct.php
namespace
AcmeStoreBundleEntity;
class Product
{
protected $name;
protected $price;
protected $description;
}
php app/console doctrine:generate:entity --entity="AcmeStoreBundle:
Product" --fields="name:string(255) price:float description:text"
Podemos
interactuar
con la consola de
symfony o pasar
todo en una línea
4. Agregando datos de mapeo a
nuestra entidad - Annotations
//
src/Acme/StoreBundle/Entity/Product.
php
namespace AcmeStoreBundleEntity;
use DoctrineORMMapping as ORM;
/**
* @ORMEntity
* @ORMTable(name="product")
*/
class Product
{
/**
* @ORMId
* @ORMColumn(type="integer")
* @ORMGeneratedValue
(strategy="AUTO")
*/
/**
* @ORMColumn(type="
string", length=100)
*/
protected $name;
/**
* @ORMColumn(type="
decimal", scale=2)
*/
protected $price;
/**
* @ORMColumn(type="text")
*/
protected $description;
}
5. Agregando datos de mapeo a
nuestra entidad - YAML
# src/Acme/StoreBundle/Resources/config/doctrine/Product.
orm.yml
AcmeStoreBundleEntityProduct:
type: entity
table: product
id:
id:
type: integer
generator: { strategy: AUTO }
fields:
name:
type: string
length: 100
price:
type: decimal
scale: 2
description:
6. Agregando datos de mapeo a
nuestra entidad - XML
<!-- src/Acme/StoreBundle/Resources/config/doctrine/Product.
orm.xml -->
<doctrine-mapping xmlns="http://doctrine-project.
org/schemas/orm/doctrine-mapping"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://doctrine-project.
org/schemas/orm/doctrine-mapping
http://doctrine-project.org/schemas/orm/doctrine-
mapping.xsd">
<entity name="AcmeStoreBundleEntityProduct" table="
product">
<id name="id" type="integer" column="id">
<generator strategy="AUTO" />
</id>
<field name="name" column="name" type="string"
length="100" />
7. Generando getters y setters
Podemos crear para todo el bundle o para
varios bundles
php app/console doctrine:generate:entities
Acme/StoreBundle/Entity/Product
php app/console doctrine:generate:entities AcmeStoreBundle
php app/console doctrine:generate:entities Acme
8. Aplicando cambios a nuestro
esquema
Si queremos ver el sql que genera el comando
$ php app/console doctrine:schema:update --force --dump-sql
$ php app/console doctrine:schema:update --force
9. Persistiendo Nuestras Entidades
// src/Acme/StoreBundle/Controller/DefaultController.php
// ...
use AcmeStoreBundleEntityProduct;
use SymfonyComponentHttpFoundationResponse;
public function createAction()
{
$product = new Product();
$product->setName('A Foo Bar');
$product->setPrice('19.99');
$product->setDescription('Lorem ipsum dolor');
$em = $this->getDoctrine()->getManager();
$em->persist($product);
$em->flush();
return new Response('Created product id '.$product->getId());
}
10. Recuperando información
public function showAction($id)
{
$product = $this->getDoctrine()->getEntityManager()
->getRepository('AcmeStoreBundle:Product')
->find($id);
if (!$product) {
throw $this->createNotFoundException(
'No product found for id '.$id
);
}
// ... haz algo, como pasar el objeto $product a una plantilla
}
11. Recuperando información
// consulta por la clave principal (generalmente 'id')
$product = $repository->find($id);
// nombres dinámicos de métodos para buscar un valor basad en
columna
$product = $repository->findOneById($id);
$product = $repository->findOneByName('foo');
// recupera TODOS los productos
$products = $repository->findAll();
// busca un grupo de productos basándose en el valor de una
columna arbitraria
$products = $repository->findByPrice(19.99);
// consulta por un producto que coincide en nombre y precio
$product = $repository->findOneBy(array('name' => 'foo', 'price' =>
19.99));
// pregunta por todos los productos en que coincide el nombre, ordenados
por precio
$product = $repository->findBy( array('name' => 'foo'), array('price',
12. Eliminando un objeto
Consultando con DQL
$em->remove($product);
$em->flush();
$em = $this->getDoctrine()->getEntityManager();
$query = $em->createQuery(
'SELECT p FROM AcmeStoreBundle:Product p WHERE p.price > :price
ORDER BY p.price ASC'
)->setParameter('price', '19.99');
$products = $query->getResult();
16. Métodos Propios en el Repositorio
// src/Acme/StoreBundle/Entity/ProductRepository.php
namespace AcmeStoreBundleEntity;
use DoctrineORMEntityRepository;
class ProductRepository extends EntityRepository
{
public function findAllOrderedByName()
{
return $this->getEntityManager()
->createQuery('SELECT p FROM AcmeStoreBundle:
Product p ORDER BY p.name ASC')
->getResult();
}
}
17. Relaciones de Entidades OneToMany
// src/Acme/StoreBundle/Entity/Category.php
// ...
use DoctrineCommonCollectionsArrayCollection;
class Category
{
// ...
/**
* @ORMOneToMany(targetEntity="Product", mappedBy="category")
*/
protected $products;
public function __construct()
{
$this->products = new ArrayCollection();
}
}
20. Guardando objetos relacionados
use AcmeStoreBundleEntityCategory;
use AcmeStoreBundleEntityProduct;
use SymfonyComponentHttpFoundationResponse;
class DefaultController extends Controller
{
public function createProductAction()
{
$category = new Category();
$category->setName('Main Products');
$product = new Product();
$product->setName('Foo');
$product->setPrice(19.99);
// relaciona este producto a la categoría
$product->setCategory($category);
$em = $this->getDoctrine()->getManager();
$em->persist($category);
$em->persist($product);
$em->flush();
...
21. Recuperando Objetos relacionados
public function showAction($id)
{
$product = $this->getDoctrine()
->getRepository('AcmeStoreBundle:Product')
->find($id);
$categoryName = $product->getCategory()->getName();
// ...
}
public function showProductAction($id)
{
$category = $this->getDoctrine()
->getRepository('AcmeStoreBundle:Category')
->find($id);
$products = $category->getProducts();
// ...
}
22. Evitando el lazy loading -JOINS
// src/Acme/StoreBundle/Entity/ProductRepository.php
public function findOneByIdJoinedToCategory($id)
{
$query = $this->getEntityManager()
->createQuery('
SELECT p, c FROM AcmeStoreBundle:Product p
JOIN p.category c
WHERE p.id = :id'
)->setParameter('id', $id);
try {
return $query->getSingleResult();
} catch (DoctrineORMNoResultException $e) {
return null;
}
}