CursosEmpresasBlogLiveConfPrecios

Listado y Creación de Empresas en Symfony

Clase 9 de 17 • Curso de Symfony Framework

Contenido del curso

Symfony Framework

  • 1
    Crea una bolsa de empleo con Symfony

    Crea una bolsa de empleo con Symfony

    01:00 min
  • 2

    Autenticación y Gestión de Ofertas en Symfony

    10:12 min
  • 3

    Desarrollo de Bolsa de Empleo con Symfony en PHP

    02:42 min
  • 4

    Modelo de Datos para Bolsa de Empleo: Entidades y Relaciones

    02:17 min
  • 5

    Virtualización y configuración de entornos de desarrollo con Homestead

    04:07 min
  • 6

    Creación y Configuración de un Proyecto Symfony con Homestead

    02:44 min
  • 7

    Creación de Entidades y Migraciones en Symfony

    04:04 min
  • 8

    Creación de Controladores y Rutas en Symfony

    04:14 min
  • 9

    Listado y Creación de Empresas en Symfony

    Viendo ahora
  • 10

    Control de Acceso y Creación de Usuarios en Symfony

    06:12 min
  • 11

    Creación de usuarios en Symfony para administradores

    02:41 min
  • 12

    Listado y Postulación a Ofertas de Trabajo en Symfony

    07:08 min
  • 13

    Layouts y herencia de templates en Twig

    03:06 min
  • 14

    Envío de Correos en Symfony con Mailer y Transport

    02:01 min
  • 15

    Despliegue de Aplicaciones Symfony en Producción

    05:16 min
  • 16

    Comparativa de Frameworks PHP: Symfony, Laravel y Más

    02:08 min
  • 17
    Symfony proyecto terminado: certifica y planifica

    Symfony proyecto terminado: certifica y planifica

    00:38 min
Tomar examen

Escuelas

  • Desarrollo Web
    • Fundamentos del Desarrollo Web Profesional
    • Diseño y Desarrollo Frontend
    • Desarrollo Frontend con JavaScript
    • Desarrollo Frontend con Vue.js
    • Desarrollo Frontend con Angular
    • Desarrollo Frontend con React.js
    • Desarrollo Backend con Node.js
    • Desarrollo Backend con Python
    • Desarrollo Backend con Java
    • Desarrollo Backend con PHP
    • Desarrollo Backend con Ruby
    • Bases de Datos para Web
    • Seguridad Web & API
    • Testing Automatizado y QA para Web
    • Arquitecturas Web Modernas y Escalabilidad
    • DevOps y Cloud para Desarrolladores Web
  • English Academy
    • Inglés Básico A1
    • Inglés Básico A2
    • Inglés Intermedio B1
    • Inglés Intermedio Alto B2
    • Inglés Avanzado C1
    • Inglés para Propósitos Específicos
    • Inglés de Negocios
  • Marketing Digital
    • Fundamentos de Marketing Digital
    • Marketing de Contenidos y Redacción Persuasiva
    • SEO y Posicionamiento Web
    • Social Media Marketing y Community Management
    • Publicidad Digital y Paid Media
    • Analítica Digital y Optimización (CRO)
    • Estrategia de Marketing y Growth
    • Marketing de Marca y Comunicación Estratégica
    • Marketing para E-commerce
    • Marketing B2B
    • Inteligencia Artificial Aplicada al Marketing
    • Automatización del Marketing
    • Marca Personal y Marketing Freelance
    • Ventas y Experiencia del Cliente
    • Creación de Contenido para Redes Sociales
  • Inteligencia Artificial y Data Science
    • Fundamentos de Data Science y AI
    • Análisis y Visualización de Datos
    • Machine Learning y Deep Learning
    • Data Engineer
    • Inteligencia Artificial para la Productividad
    • Desarrollo de Aplicaciones con IA
    • AI Software Engineer
  • Ciberseguridad
    • Fundamentos de Ciberseguridad
    • Hacking Ético y Pentesting (Red Team)
    • Análisis de Malware e Ingeniería Forense
    • Seguridad Defensiva y Cumplimiento (Blue Team)
    • Ciberseguridad Estratégica
  • Liderazgo y Habilidades Blandas
    • Fundamentos de Habilidades Profesionales
    • Liderazgo y Gestión de Equipos
    • Comunicación Avanzada y Oratoria
    • Negociación y Resolución de Conflictos
    • Inteligencia Emocional y Autogestión
    • Productividad y Herramientas Digitales
    • Gestión de Proyectos y Metodologías Ágiles
    • Desarrollo de Carrera y Marca Personal
    • Diversidad, Inclusión y Entorno Laboral Saludable
    • Filosofía y Estrategia para Líderes
  • Diseño de Producto y UX
    • Fundamentos de Diseño UX/UI
    • Investigación de Usuarios (UX Research)
    • Arquitectura de Información y Usabilidad
    • Diseño de Interfaces y Prototipado (UI Design)
    • Sistemas de Diseño y DesignOps
    • Redacción UX (UX Writing)
    • Creatividad e Innovación en Diseño
    • Diseño Accesible e Inclusivo
    • Diseño Asistido por Inteligencia Artificial
    • Gestión de Producto y Liderazgo en Diseño
    • Diseño de Interacciones Emergentes (VUI/VR)
    • Desarrollo Web para Diseñadores
    • Diseño y Prototipado No-Code
  • Contenido Audiovisual
    • Fundamentos de Producción Audiovisual
    • Producción de Video para Plataformas Digitales
    • Producción de Audio y Podcast
    • Fotografía y Diseño Gráfico para Contenido Digital
    • Motion Graphics y Animación
    • Contenido Interactivo y Realidad Aumentada
    • Estrategia, Marketing y Monetización de Contenidos
  • Desarrollo Móvil
    • Fundamentos de Desarrollo Móvil
    • Desarrollo Nativo Android con Kotlin
    • Desarrollo Nativo iOS con Swift
    • Desarrollo Multiplataforma con React Native
    • Desarrollo Multiplataforma con Flutter
    • Arquitectura y Patrones de Diseño Móvil
    • Integración de APIs y Persistencia Móvil
    • Testing y Despliegue en Móvil
    • Diseño UX/UI para Móviles
  • Diseño Gráfico y Arte Digital
    • Fundamentos del Diseño Gráfico y Digital
    • Diseño de Identidad Visual y Branding
    • Ilustración Digital y Arte Conceptual
    • Diseño Editorial y de Empaques
    • Motion Graphics y Animación 3D
    • Diseño Gráfico Asistido por Inteligencia Artificial
    • Creatividad e Innovación en Diseño
  • Programación
    • Fundamentos de Programación e Ingeniería de Software
    • Herramientas de IA para el trabajo
    • Matemáticas para Programación
    • Programación con Python
    • Programación con JavaScript
    • Programación con TypeScript
    • Programación Orientada a Objetos con Java
    • Desarrollo con C# y .NET
    • Programación con PHP
    • Programación con Go y Rust
    • Programación Móvil con Swift y Kotlin
    • Programación con C y C++
    • Administración Básica de Servidores Linux
  • Negocios
    • Fundamentos de Negocios y Emprendimiento
    • Estrategia y Crecimiento Empresarial
    • Finanzas Personales y Corporativas
    • Inversión en Mercados Financieros
    • Ventas, CRM y Experiencia del Cliente
    • Operaciones, Logística y E-commerce
    • Gestión de Proyectos y Metodologías Ágiles
    • Aspectos Legales y Cumplimiento
    • Habilidades Directivas y Crecimiento Profesional
    • Diversidad e Inclusión en el Entorno Laboral
    • Herramientas Digitales y Automatización para Negocios
  • Blockchain y Web3
    • Fundamentos de Blockchain y Web3
    • Desarrollo de Smart Contracts y dApps
    • Finanzas Descentralizadas (DeFi)
    • NFTs y Economía de Creadores
    • Seguridad Blockchain
    • Ecosistemas Blockchain Alternativos (No-EVM)
    • Producto, Marketing y Legal en Web3
  • Recursos Humanos
    • Fundamentos y Cultura Organizacional en RRHH
    • Atracción y Selección de Talento
    • Cultura y Employee Experience
    • Gestión y Desarrollo de Talento
    • Desarrollo y Evaluación de Liderazgo
    • Diversidad, Equidad e Inclusión
    • AI y Automatización en Recursos Humanos
    • Tecnología y Automatización en RRHH
  • Finanzas e Inversiones
    • Fundamentos de Finanzas Personales y Corporativas
    • Análisis y Valoración Financiera
    • Inversión y Mercados de Capitales
    • Finanzas Descentralizadas (DeFi) y Criptoactivos
    • Finanzas y Estrategia para Startups
    • Inteligencia Artificial Aplicada a Finanzas
    • Domina Excel
    • Financial Analyst
    • Conseguir trabajo en Finanzas e Inversiones
  • Startups
    • Fundamentos y Validación de Ideas
    • Estrategia de Negocio y Product-Market Fit
    • Desarrollo de Producto y Operaciones Lean
    • Finanzas, Legal y Fundraising
    • Marketing, Ventas y Growth para Startups
    • Cultura, Talento y Liderazgo
    • Finanzas y Operaciones en Ecommerce
    • Startups Web3 y Blockchain
    • Startups con Impacto Social
    • Expansión y Ecosistema Startup
  • Cloud Computing y DevOps
    • Fundamentos de Cloud y DevOps
    • Administración de Servidores Linux
    • Contenerización y Orquestación
    • Infraestructura como Código (IaC) y CI/CD
    • Amazon Web Services
    • Microsoft Azure
    • Serverless y Observabilidad
    • Certificaciones Cloud (Preparación)
    • Plataforma Cloud GCP

Platzi y comunidad

  • Platzi Business
  • Live Classes
  • Lanzamientos
  • Executive Program
  • Trabaja con nosotros
  • Podcast

Recursos

  • Manual de Marca

Soporte

  • Preguntas Frecuentes
  • Contáctanos

Legal

  • Términos y Condiciones
  • Privacidad
  • Tyc promociones
Reconocimientos
Reconocimientos
Logo reconocimientoTop 40 Mejores EdTech del mundo · 2024
Logo reconocimientoPrimera Startup Latina admitida en YC · 2014
Logo reconocimientoPrimera Startup EdTech · 2018
Logo reconocimientoCEO Ganador Medalla por la Educación T4 & HP · 2024
Logo reconocimientoCEO Mejor Emprendedor del año · 2024
De LATAM conpara el mundo
YoutubeInstagramLinkedInTikTokFacebookX (Twitter)Threads

      La vista del administrador

      En la clase anterior comenzamos a desarrollar la funcionalidad del usuario administrador, aprendiste cómo crear un nuevo controlador, cómo vincularlo a una URL y cómo desarrollar un template.

      En esta clase vamos a darle concretud mediante un ejemplo de nuestro proyecto: el listado de las empresas registradas.

      El listado de empresas

      Usualmente las URLs que mapean a métodos index tienen como objetivo mostrar listados completos de objetos, en nuestro caso, se trata de ofertas.

      Así que, realicemos las modificaciones que necesitamos para lograr ello.

      Lo primero que vamos a requerir es acceder a las ofertas que existen, para ello tendremos que valernos de uno de los servicios que Symfony (más bien Doctrine) provee: el EntityManager.

      En Symfony el concepto de Servicio es muy importante: se trata de clases que realizan alguna función, aunque su estado no es importante.

      Básicamente podrías pensar que las clases de una aplicación Symfony se clasifican en Entidades y Servicios.

      Una de las características más interesantes que ha introducido Symfony a partir de la versión 4 es el autowiring.

      Se trata de un mecanismo que permite que las instancias de los objetos servicio disponibles en el Contenedor de Dependencias (otro de los componentes core del framework) sean inyectadas a cualquier método público que las requiera con sólo definirlas como parámetro.

      El método index de CompanyController ahora debe declararse así:

      public function index(EntityManagerInterface $entityManager) { $companies = $entityManager ->getRepository(Company::class) ->findAll(); return $this->render('company/index.html.twig', [ 'companies' => $companies, ]); }

      Toda la “magia” del autowiring se basa en el uso extensivo de type-hinting (realmente no se trata de magia como te habrás imaginado).

      El Contenedor de Dependencias identifica a cada servicio por su clase (o interface), de esa forma es sencillo determinar los argumentos que deberán utilizarse al momento de realizar la invocación de estos métodos.

      ¡Ah! Casi lo olvido, hay un par de sentencias use que debes agregar al comienzo (ver nota):

      • use Doctrine\ORM\EntityManagerInterface;
      • use App\Entity\Company;

      Y ahora sólo nos queda adaptar el template templates/company/index.html.twig:

      {% extends 'base.html.twig' %} {% block title %}Empresas registradas{% endblock %} {% block body %} <style> .example-wrapper { margin: 1em auto; max-width: 800px; width: 95%; font: 18px/1.5 sans-serif; } .example-wrapper code { background: #F5F5F5; padding: 2px 6px; } </style> <div class="example-wrapper"> <h1>Empresas registradas</h1> {% if companies|length > 0 %} <ul> {% for company in companies %} <li>{{ company.name }} - {{ company.email }}</li> {% endfor %} </ul> {% else %} <p>Aún no hay empresas</p> {% endif %} </div> {% endblock %}

      Si refrescas tu navegador verás:

      No hay empresas registradas

      Lo cual es lógico… aún no se ha creado ninguna empresa :p.

      Creación de una empresa

      Para crear empresas será necesario contar con:

      1. Un nuevo método.
      2. Un nuevo template.

      De modo que, ¡manos a la obra!

      Antes de empezar a tirar código, sabemos que necesitaremos un formulario para ingresar los datos.

      Para crearlo usaremos el comando php bin/console make:form.

      En el nombre del formulario usaremos CompanyType (el sufijo Type es una convención de Symfony) y lo asociaremos a la entidad Company.

      De este modo obtendremos una nueva clase src/Form/CompanyType, la cual contendrá los objetos que se usarán para crear el HTML del formulario (tanto en la creación de ofertas como en la edición).

      Si vemos el formulario construido notaremos que falta algo… ¿Cómo hará el usuario para enviar los datos sin un botón de submit?

      De modo que mejor lo agregamos al método CompanyType::buildForm():

      $builder ->add('name') ->add('email') ->add('save', SubmitType::class, [ 'label' => 'Guardar', ]) ;

      Ahora sí, armemos el nuevo método en CompanyController:

      /** * @param Request $request * @param EntityManagerInterface $entityManager * @return \Symfony\Component\HttpFoundation\RedirectResponse|\Symfony\Component\HttpFoundation\Response * @Route("/company/new", name="company_new") */ public function create(Request $request, EntityManagerInterface $entityManager) { $company = new Company(); $form = $this->createForm(CompanyType::class); $form->setData($company); $form->handleRequest($request); if ($form->isSubmitted() && $form->isValid()) { $company = $form->getData(); $entityManager->persist($company); $entityManager->flush(); return $this->redirectToRoute('company'); } return $this->render('company/new.html.twig', [ 'form' => $form->createView(), ]); }

      ¡Listo! ¡Nuestro administrador ya puede crear empresas!

      La pregunta que surge es ¿sólo el administrador puede crear empresas?

      Pues así debería ser pero con lo que hicimos hasta ahora cualquiera con la URL correcta puede… hay que remediar eso.

      En la próxima clase construiremos un sistema de login con el que limitaremos el acceso a las partes sensibles de nuestra aplicación.

      ¡Allá vamos!

      Nota

      El código mostrado lo he generado utilizando un IDE que agrega automáticamente las sentencias use. Si no cuentas con una herramienta como esta es posible que te encuentres con errores al ejecutar el código tal cual se ve. No te preocupes, Symfony te dará un mensaje sumamente claro respecto de qué debes corregir para que todo funcione.

        Alberto Ramírez Caballero

        Alberto Ramírez Caballero

        student•
        hace 6 años

        Buenas, ya que no está la template new.html.twig os dejo por aquí la que he montado yo :)

        {% extends 'base.html.twig' %} {% block title %}Nuevas empresas{% endblock %} {% block body %} <style> .example-wrapper { margin: 1em auto; max-width: 800px; width: 95%; font: 18px/1.5 sans-serif; } .example-wrapper code { background: #F5F5F5; padding: 2px 6px; } </style> <div class="example-wrapper"> <h1>Nuevas empresas</h1> {{ form(form) }} </div> {% endblock %}
          Jimmy Buriticá Londoño

          Jimmy Buriticá Londoño

          student•
          hace 5 años

          Gracias por el código, se le pasó al profesor.

        Carlos Eduardo Gomez García

        Carlos Eduardo Gomez García

        teacher•
        hace 5 años

        Bufff, muy escasa la explicación, trato de hacer comparaciones con Laravel para quienes lo conocen les sea más fácil relacionar conceptos.

        Prácticamente el autowiring es la inyección de dependencias de Laravel, es decir, mediante el nombre de la clase puedes pasar por el parámetro de una función lo que necesites.

        Por cierto, esto tampoco se explica pero para ver la página tendrías que entrar a /company/new pero te dará un error porque no tenemos ningún template para eso, cosa qué faltó explicar...

        Jimmy Buriticá Londoño

        Jimmy Buriticá Londoño

        student•
        hace 5 años

        Es increíble, me toco leer la explicación del profesor dos veces, luego todos los comentarios de los compañeros, solucionar cada error y lo logré. Ya puedo adicionar empresas. De no ser por la ayuda de los compañeros, hubiera sido muy difícil completar esta clase.

        Carlos Eduardo Gomez García

        Carlos Eduardo Gomez García

        teacher•
        hace 5 años

        Si no se les muesra el formulario y les sale un error de que no encuentra la ruta, la solución es:

        Añadir un archivo llamado: new.html.twig dentro de templates/company

        Dentro de ese archivo colocar esto:

        {{ form(form) }}

        Con eso debería pintarse su formulario

        Jose Angel Mosquera Rodríguez

        Jose Angel Mosquera Rodríguez

        student•
        hace 5 años

        Es más fácil si usamos

        php bin/console make:crud

        para crear el controlador con todo lo necesario para listar, editar, modificar y borrar y, además, nos crea el formType y todas las vistas necesarias sin tener que rompernos tanto la cabeza

        Juan Caviglia

        Juan Caviglia

        company_admin•
        hace 5 años

        Como ya comentaron otros ojo porque aquí faltan varias cosas:

        1. relacionado a las notas del profesor, no se está la indicación de agregar los "use" para que funcione el autowiring. Tuve que agregar varios (detallados abajo por RetaxMaster. Además tuve que agregar:

        use Symfony\Component\Form\Extension\Core\Type\SubmitType;

        En CompanyType.php

        1. No se indica crear el nuevo template (company/new.html.twig). Si no encuentra ese archivo no va a funcionar.

        2. aunque está en el bloque de código de muestra al crear el nuevo método en CompanyController, no se hace mención a la importancia de la ruta ni el uso de parámetros que allí se muestra.

        Carlos Eduardo Gomez García

        Carlos Eduardo Gomez García

        teacher•
        hace 5 años

        Les dejo mi CompanyController.php con los respectivos use funcionando:

        <?php namespace App\Controller; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Annotation\Route; use Doctrine\ORM\EntityManagerInterface; use App\Entity\Company; use App\Form\CompanyType; use Symfony\Component\HttpFoundation\Request; class CompanyController extends AbstractController { /** * @Route("/company", name="company") */ public function index(EntityManagerInterface $entityManager) { $companies = $entityManager ->getRepository(Company::class) ->findAll(); return $this->render('company/index.html.twig', [ 'companies' => $companies, ]); } /** * @param Request $request * @param EntityManagerInterface $entityManager * @return \Symfony\Component\HttpFoundation\RedirectResponse|\Symfony\Component\HttpFoundation\Response * @Route("/company/new", name="company_new") */ public function create(Request $request, EntityManagerInterface $entityManager) { $company = new Company(); $form = $this->createForm(CompanyType::class); $form->setData($company); $form->handleRequest($request); if ($form->isSubmitted() && $form->isValid()) { $company = $form->getData(); $entityManager->persist($company); $entityManager->flush(); return $this->redirectToRoute('company'); } return $this->render('company/new.html.twig', [ 'form' => $form->createView(), ]); } }
          Jimmy Buriticá Londoño

          Jimmy Buriticá Londoño

          student•
          hace 5 años

          Gracias.

        Juan Jose Gil

        Juan Jose Gil

        student•
        hace 5 años

        Este curso se merece una mejor explicacion y darle un poquito mas de cariño. No le quito el esfuerzo dado al curso, pero no creo que sea la mejor ruta para aprender, si colocase mini videos o de alguna forma explicar lo que se va a usar en el curso, no solo colocar copie esto y listo, necesitamos esto copie y listo.

        Alejandro Zorita

        Alejandro Zorita

        student•
        hace 6 años

        Un poco escasa esta parte, ni vista ni declaración del use.

        Para el Request, usar: use Symfony\Component\HttpFoundation\Request;

          Alberto D. Sosa

          Alberto D. Sosa

          student•
          hace 6 años

          Si están faltando explicaciones y código, gracias a los comentarios de los compañeros, que no soy un novato y a la documentación lo estoy sacando pero es lo que tu dices los que son muy nuevos tienen que estar más perdidos que un pulpo en un garaje ;-).

        Alejandro Zorita

        Alejandro Zorita

        student•
        hace 6 años

        Tampoco está implementado el arrayAccess y en mi caso da error, así quedaría mi código añadiendo los métodos de la implementación:

        use App\Repository\CompanyRepository; use ArrayAccess; use Doctrine\Common\Collections\ArrayCollection; use Doctrine\Common\Collections\Collection; use Doctrine\ORM\Mapping as ORM; /** * @ORM\Entity(repositoryClass=CompanyRepository::class) */ class Company implements ArrayAccess
        public function offsetExists($offset) { // TODO: Implement offsetExists() method. } public function offsetGet($offset) { // TODO: Implement offsetGet() method. } public function offsetSet($offset, $value) { // TODO: Implement offsetSet() method. } public function offsetUnset($offset) { // TODO: Implement offsetUnset() method. }
        Cristian Orlando Rincon Bonilla

        Cristian Orlando Rincon Bonilla

        student•
        hace 6 años

        Buen día, no hay referencias sobre el template de new company.

        orlando morales andrade

        orlando morales andrade

        student•
        hace 4 años

        Si el curso es modo lectura, seria bueno que tuviese un buscador local para encontrar rápidamente contenido específico del curso.

          Tania Sosa

          Tania Sosa

          student•
          hace 4 años

          ¡Hola Platzinauta! 😄

          Muchas gracias por tu comentario, los tendremos en cuenta para futuras versiones del curso.

          ¡Nunca pares de aprender! 💚

        Yoalbert Luis

        Yoalbert Luis

        student•
        hace 4 años

        para ver el formulario se necesita agregar

        use Symfony\Component\Form\Extension\Core\Type\SubmitType;

        Nilson Reyes Sigua

        Nilson Reyes Sigua

        student•
        hace 5 años

        Creo que aprendo más y mejor cuando los contenidos son vídeos y puedo desarrollar las actividades a la par con el docente.