Una vez identificado que se trata de un usuario responsable de una empresa, resta saber de qué empresa se trata.
Para ello haremos una consulta a través de Doctrine.
Dado que se trata de una consulta simple podemos usar el método findOneBy de la clase CompanyRepository: vamos a buscar una empresa cuyo dueño sea el usuario que ha iniciado sesión:
$company=$this->entityManager->getRepository(Company::class)->findOneBy(['owner'=>$token->getUser(),])Aquí se ve cómo utilizamos el servicio entityManager(disponible porque ha sido inyectado en el constructor del controlador) para obtener acceso al repositorio correspondiente a la entidad Company.
El criterio de búsqueda establece que el campo owner debe coincidir con el usuario obtenido del token.
En caso de haberse obtenido tal compañía haremos una redirección hacia una página que nos muestre las ofertas publicadas por ella.
El código completo se verá de esta forma:
publicfunctiononAuthenticationSuccess(Request$request,TokenInterface$token,$providerKey){if($targetPath=$this->getTargetPath($request->getSession(),$providerKey)){returnnewRedirectResponse($targetPath);}$roles=$token->getUser()->getRoles();if(in_array('ROLE_ADMIN',$roles)){returnnewRedirectResponse($this->urlGenerator->generate('company'));}elseif(in_array('ROLE_COMPANY',$roles)){if($company=$this->entityManager->getRepository(Company::class)->findOneBy(['owner'=>$token->getUser(),])){returnnewRedirectResponse($this->urlGenerator->generate('company_offers',['id'=>$company->getId()]));}}// For example : return new RedirectResponse($this->urlGenerator->generate('some_route'));thrownew\Exception('TODO: provide a valid redirect inside '.__FILE__);}
Lo que vemos aquí es cómo generamos una URL usando el método generate del servicio urlGenerator.
El primer parámetro es el nombre de la ruta que usaremos, el segundo es un arreglo de parámetros para la ruta.
Es lo mismo que habíamos visto anteriormente cuando usamos la función url de Twig.
Pero… un momento, ¿dónde está definida la ruta company_offers? ¡En ningún lado! Un poquito de paciencia por favor. :)
Lo que precisamos justamente es un método en algún controlador que responda a una ruta llamada de ese modo. ¿Qué mejor momento que este para crearlo?
Ya que se trata de una acción referida a una empresa, es una buena idea que el método forme parte del controlador CompanyController.
Algo que sabemos es que tendrá que tener asociada una ruta llamada company_offers y que, en algún lado del patrón de URL deberá existir un argumento llamado id.
Las {} son un placeholder que se transformará en un parámetro para el método que maneje esta ruta.
Es decir, una url como /company/10/offers será atendida por este método y uno de sus parámetros se llamará $id (y su valor será 10).
Con lo cual, la misión por delante será encontrar una empresa cuyo id coincida con el parámetro recibido y mostrar sus ofertas o dar un 404 en caso de que no exista.
Consiguiendo las ofertas de la empresa
Un modo de obtener la empresa sería definir el método de esta forma:
publicfunctionshowOffers(int$id)
Y realizar la búsqueda mediante una llamada a algún find de Doctrine. Eso no estaría mal, pero sería más laborioso que lo necesario (además de dejar de nuestro lado el manejo de situaciones como el caso de no encontrar a la empresa).
Nuevamente, la magia de Symfony (bueno, en este caso debemos darle algo de crédito a Doctrine también).
Para comenzar, el framework está comprendiendo que $company será un objeto de clase Company (Esta parte es fácil: ¡se lo estamos diciendo nosotros!).
Luego, se está enterando de que se trata de una entidad manejada por Doctrine (ya que la clase Company está definida utilizando el annotation @ORM\Entity).
Y luego, sabe que deberá realizar el find porque existe un atributo llamado id dentro de la definición de dicha entidad.
Con lo cual, en caso de no encontrarlo se generará en forma automática un error 404, de modo que nosotros podemos asumir que si el método se ejecuta es porque la entidad en cuestión existe en la base de datos.
Interesante, ¿no? :)
Una vez obtenida, simplemente pasémosla al template para que se encargue de la visualización: