2016-04-26 1 views
1

J'ai un projet dans symfony 2 ... et j'ai ce problème.comment séparer les fonctions et les appeler php

je ce fichier src/ApiV1Bundle/contrôleur/TeamsController.php sorcière ont ce contenu:

<?php 

namespace ApiV1Bundle\Controller; 

use AppBundle\Entity\Teams; 
use ApiV1Bundle\Collection\TeamsCollection; 
use Symfony\Bundle\FrameworkBundle\Controller\Controller; 
use Symfony\Component\HttpFoundation\Response; 
use Cocur\Slugify\Slugify; 

Class TeamsController extends Controller 
{ 
    /** 
    * Lists all Teams entities. 
    * 
    */ 
    public function getTeamsAction() 
    { 

     $em = $this->getDoctrine()->getManager(); 

     $teams = $em->getRepository('AppBundle:Teams')->findBy(['active' => 1]); 
     $resource = []; 

     foreach ($teams as $team) { 
      array_push($resource, $this->displayTeam($team)); 
     } 

     $response = new Response(json_encode($resource)); 

     $response->setStatusCode(200); 
     $response->headers->set('Content-Type', 'application/json'); 

     return $response; 
    } 

    function displayTeam(Teams $team) 
    { 
     $slug = new Slugify(); 

     $resource['id'] = $team->getId(); 
     $resource['name'] = $team->getName(); 
     $resource['slug'] = $slug->slugify($team->getName()); 
     $resource['league'] = $slug->slugify($team->getLeagueId()); 
     $resource['shield'] = $slug->slugify($team->getMultimediaId()); 

     return $resource; 
    } 

} 

Et cela fonctionne parfaitement ... mais je besoin de séparer les fonctions auxiliaires, au code principal ... dans un fichier comme celui-ci.

Voici l'itinéraire: src/ApiV1Bundle/Collection/TeamCollection.php, avec ce contenu:

<?php 

namespace ApiV1Bundle\Collection; 

use AppBundle\Entity\Teams; use Cocur\Slugify\Slugify; 

Class TeamsCollection { 

    function displayTeam(Teams $team) 
    { 
     $slug = new Slugify(); 

     $resource['id'] = $team->getId(); 
     $resource['name'] = $team->getName(); 
     $resource['slug'] = $slug->slugify($team->getName()); 
     $resource['league'] = $slug->slugify($team->getLeagueId()); 
     $resource['shield'] = $slug->slugify($team->getMultimediaId()); 

     return $resource; 
    } 
} 

Ceci pour conserver le fichier du contrôleur plus propre, mais je ne sais pas comment appeler cette nouveau fichier dans mon pilote, ou si je crée bien, ou si quelque chose manque.

Répondre

0

Ce serait ma suggestion:

use ApiV1Bundle\Collection\TeamsCollection; 

public function getTeamsAction() 
{ 
    $em = $this->getDoctrine()->getManager(); 

    $teams = $em->getRepository('AppBundle:Teams')->findBy(['active' => 1]); 
    $resource = $team->map(function($team) { 
     return TeamsCollection::displayTeam($team) 
    }; 

    $response = new JsonResponse($resource); 

    return $response; 
} 

Dans ce cas, vous devez faire displayTeam une fonction statique. Vous pouvez le faire:

$teamcollection = new TeamCollection(); 
return $teamcollection->displayTeam($team); 

En prime, je lui ai donné deux autres suggestions:

  • Utilisation JsonResponse au lieu de la réponse. Dans ce cas, vous n'avez pas besoin de définir un Content-Type. La définition de StatusCode sur 200 n'est pas nécessaire: c'est l'état par défaut.
  • Utilisez ArrayCollection::map. C'est une super fonction, mais (malheureusement) ce n'est pas très populaire.
+0

Et à ce sujet? – Martin