2015-04-16 58 views
0

我慢慢開始理解Symfony2中的事情是如何工作的。Symfony2將控制器邏輯重構爲服務

我已經建立了一個服務,它從實時饋送中提取json數據。

我的控制器使用此服務來提取數據,然後將其保存到我的數據庫中,目前我有3個實體,但可能還會有更多。

所有目前的邏輯是FantasyPro/DataBundle

我正在打破各種規則,如堅持我的數據是在控制器的邏輯,所以我想我需要承擔這一切邏輯,並將其放入一個服務中,我可以使用它將持久性數據通過教義保存到我的數據庫中。

我想創建在DataBundle

這個新PersistServce作爲服務將需要使用所有的學說該實體我有,以及API服務我不知道如何去製造這些可用到服務。

可能值得一提的是,我打算創建命令,以便我可以運行cron作業來提取這些數據,實際上我不認爲我需要控制器,因爲它們只會在內部使用,而不能用於生成請求。

我現在只是在控制器中進行測試。

將此代碼重構爲服務的最佳方式是什麼?

繼承人我凌亂的控制器代碼

<?php 

namespace FantasyPro\DataBundle\Controller; 

use Symfony\Bundle\FrameworkBundle\Controller\Controller; 
use FantasyPro\DataBundle\Entity\Stadium; 
use FantasyPro\DataBundle\Entity\Team; 
use FantasyPro\DataBundle\Entity\Player; 

class DefaultController extends Controller 
{ 
    public function indexAction($name) 
    { 
     return $this->render('DataBundle:Default:index.html.twig', array('name' => $name)); 
    } 

    /** 
    * @return \Symfony\Component\HttpFoundation\Response 
    */ 
    public function updateStadiumAction(){ 
     //get list of stadiums 

     $client = $this->container->get('fantasyapi'); 
     $stadiumData = $client->Stadiums(); 

     //get the entity manager 
     $em = $this->getDoctrine()->getManager(); 
     $repo = $em->getRepository('DataBundle:Stadium'); 
     $log = array(); 

     $log = $this->addStadiumList($stadiumData, $repo, $em, $log); 

     $em->flush(); 
     return $this->render('DataBundle:Default:index.html.twig', array('log' => $log)); 
    } 

    public function updateTeamAction() 
    { 

     //get list of teams 

     $client = $this->container->get('fantasyapi'); 
     $teamData = $client->Teams(); 

     //get the entity manager 
     $em = $this->getDoctrine()->getManager(); 
     $repo = $em->getRepository('DataBundle:Team'); 
     $log = array(); 

     $log = $this->addTeamList($teamData, $repo, $em, $log, 'Team'); 

     $em->flush(); 
     return $this->render('DataBundle:Default:index.html.twig', array('log' => $log)); 
    } 

    public function updatePlayerAction() 
    { 
     //get the api client 
     $client = $this->container->get('fantasyapi'); 

     //get the manager 
     $em = $this->getDoctrine()->getManager(); 

     $teamRepo = $em->getRepository('DataBundle:Team'); 
     $playerRepo = $em->getRepository('DataBundle:Player'); 
     $log = array(); 

     //first we need to get a list of teams as players can only be collected via a teamID 
     /** @var Team $teams */ 
     $teams = $client->Teams(); 
     //var_dump($teams);die; 
     //loop through the teams and pull the playerData 

     foreach($teams as $team){ 
      //log the team we are processing 
      $logData = ['action' => 'Processing Players for:', 'itemID' => $team['TeamID'], 'itemName' => $team['FullName']]; 
      $log[] = $logData; 

      //get list players on this team 
      $players = $client->Players(['Team' => $team['Key']]); 
      //loop through the players 

      $log = $this->addPlayerList($players, $playerRepo, $em, $log, 'Added Active Player'); 
     } 

     //now get free agents 

     $freeAgents = $client->FreeAgents(); 

     $log = $this->addPlayerList($freeAgents, $playerRepo, $em, $log, 'Free Agent'); 

     $em->flush(); 
     return $this->render('DataBundle:Default:index.html.twig', array('log' => $log)); 

    } 

    public function parseDate($dateString) 
    { 
     if ($dateString) { 

      preg_match('/\/Date\((\d+)([-+])(\d+)\)\//', $dateString, $date); 

      $timestamp = $date[1]/1000; 
      $operator = $date[2]; 
      $hours  = $date[3] * 36; // Get the seconds 

      // $datetime = new \DateTime($timestamp, new \DateTimeZone('America/New_York')); 

      $datetime = new \DateTime(); 
      $datetime->setTimestamp($timestamp); 
      $datetime->modify($operator.$hours.' seconds'); 
      $datetime->setTimezone(new \DateTimeZone('UTC')); 


      //$datetime->format('d-m-Y H:i:s'); 
      //var_dump($datetime); 
      //echo('*'); 
      return ($datetime); 
     } 
     return(null); 
    } 

    /** 
    * @param Array $players 
    * @param $playerRepo 
    * @param $em 
    * @param Array $log 
    * 
    * @param String $logTitle 
    * 
    * @return array 
    */ 
    public function addPlayerList($players, $playerRepo, $em, $log, $logTitle) 
    { 
     foreach ($players as $player) { 
      // Get the current player in the list 
      $criteria = array('playerID' => $player['PlayerID']); 

      /** @var Player $storedPlayer */ 
      $storedPlayer = $playerRepo->FindOneBy($criteria); 

      //var_dump($player); 
      if (! $storedPlayer) { 
       //no player exists with the PlayerID passed 
       //create a new entry 
       /** @var Player $entry */ 
       $entry = new Player(); 

       $entry->setTeam($player['Team']); 
       $entry->setPlayerID($player['PlayerID']); 
       $entry->setNumber($player['Number']); 
       $entry->setFirstName($player['FirstName']); 
       $entry->setLastName($player['LastName']); 
       $entry->setPosition($player['Position']); 
       $entry->setStatus($player['Status']); 
       $entry->setHeight($player['Height']); 
       $entry->setWeight($player['Weight']); 
       //need to parse the date on this field 
       $entry->setBirthDate($this->parseDate($player['BirthDate'])); 
       $entry->setCollege($player['College']); 
       $entry->setExperience($player['Experience']); 
       $entry->setFantasyPosition($player['FantasyPosition']); 
       $entry->setActive($player['Active']); 
       $entry->setPositionCategory($player['PositionCategory']); 
       $entry->setName($player['Name']); 
       $entry->setAge($player['Age']); 
       $entry->setExperienceString($player['ExperienceString']); 
       $entry->setBirthDateString($player['BirthDateString']); 
       $entry->setPhotoUrl($player['PhotoUrl']); 
       $entry->setByeWeek($player['ByeWeek']); 
       $entry->setUpcomingGameOpponent($player['UpcomingGameOpponent']); 
       $entry->setUpcomingGameWeek($player['UpcomingGameWeek']); 
       $entry->setShortName($player['ShortName']); 
       $entry->setAverageDraftPos($player['AverageDraftPosition']); 
       $entry->setDepthPositionCategory($player['DepthPositionCategory']); 
       $entry->setDepthPosition($player['DepthOrder']); 
       $entry->setDepthDisplayOrder($player['DepthDisplayOrder']); 
       $entry->setCurrentTeam($player['CurrentTeam']); 
       $entry->setCollegeDraftTeam($player['CollegeDraftTeam']); 
       $entry->setCollegeDraftYear($player['CollegeDraftYear']); 
       $entry->setCollegeDraftRound($player['CollegeDraftRound']); 
       $entry->setCollegeDraftPick($player['CollegeDraftPick']); 
       $entry->setIsUndraftedFreeAgent($player['IsUndraftedFreeAgent']); 
       $entry->setHeightFeet($player['HeightFeet']); 
       $entry->setHeightInches($player['HeightInches']); 
       $entry->setUpcomingOpponentRank($player['UpcomingOpponentRank']); 
       $entry->setUpcomingOpponentPositionRank($player['UpcomingOpponentPositionRank']); 
       $entry->setCurrentStatus($player['CurrentStatus']); 
       $entry->setUpcomingSalary($player['UpcomingSalary']); 

       $em->persist($entry); 
       $logData = [ 'action' => 'Added '.$logTitle, 
          'itemID' => $player['PlayerID'], 
          'itemName' => $player['Name'] 
       ]; 
       $log[] = $logData; 
      } else { 
       $storedPlayer->setPlayerID($player['PlayerID']); 
       $storedPlayer->setTeam($player['Team']); 
       $storedPlayer->setPlayerID($player['PlayerID']); 
       $storedPlayer->setNumber($player['Number']); 
       $storedPlayer->setFirstName($player['FirstName']); 
       $storedPlayer->setLastName($player['LastName']); 
       $storedPlayer->setPosition($player['Position']); 
       $storedPlayer->setStatus($player['Status']); 
       $storedPlayer->setHeight($player['Height']); 
       $storedPlayer->setWeight($player['Weight']); 
       //need to parse the date on this field 
       $storedPlayer->setBirthDate($this->parseDate($player['BirthDate'])); 
       $storedPlayer->setCollege($player['College']); 
       $storedPlayer->setExperience($player['Experience']); 
       $storedPlayer->setFantasyPosition($player['FantasyPosition']); 
       $storedPlayer->setActive($player['Active']); 
       $storedPlayer->setPositionCategory($player['PositionCategory']); 
       $storedPlayer->setName($player['Name']); 
       $storedPlayer->setAge($player['Age']); 
       $storedPlayer->setExperienceString($player['ExperienceString']); 
       $storedPlayer->setBirthDateString($player['BirthDateString']); 
       $storedPlayer->setPhotoUrl($player['PhotoUrl']); 
       $storedPlayer->setByeWeek($player['ByeWeek']); 
       $storedPlayer->setUpcomingGameOpponent($player['UpcomingGameOpponent']); 
       $storedPlayer->setUpcomingGameWeek($player['UpcomingGameWeek']); 
       $storedPlayer->setShortName($player['ShortName']); 
       $storedPlayer->setAverageDraftPos($player['AverageDraftPosition']); 
       $storedPlayer->setDepthPositionCategory($player['DepthPositionCategory']); 
       $storedPlayer->setDepthPosition($player['DepthOrder']); 
       $storedPlayer->setDepthDisplayOrder($player['DepthDisplayOrder']); 
       $storedPlayer->setCurrentTeam($player['CurrentTeam']); 
       $storedPlayer->setCollegeDraftTeam($player['CollegeDraftTeam']); 
       $storedPlayer->setCollegeDraftYear($player['CollegeDraftYear']); 
       $storedPlayer->setCollegeDraftRound($player['CollegeDraftRound']); 
       $storedPlayer->setCollegeDraftPick($player['CollegeDraftPick']); 
       $storedPlayer->setIsUndraftedFreeAgent($player['IsUndraftedFreeAgent']); 
       $storedPlayer->setHeightFeet($player['HeightFeet']); 
       $storedPlayer->setHeightInches($player['HeightInches']); 
       $storedPlayer->setUpcomingOpponentRank($player['UpcomingOpponentRank']); 
       $storedPlayer->setUpcomingOpponentPositionRank($player['UpcomingOpponentPositionRank']); 
       $storedPlayer->setCurrentStatus($player['CurrentStatus']); 
       $storedPlayer->setUpcomingSalary($player['UpcomingSalary']); 

       $em->persist($storedPlayer); 
       $logData = [ 'action' => 'Updated '.$logTitle, 
          'itemID' => $player['PlayerID'], 
          'itemName' => $player['Name'] 
       ]; 
       $log[] = $logData; 
      } 
     } 

     return ($log); 
    } 

    /** 
    * @param Array $teamData 
    * @param $repo 
    * @param $em 
    * @param String $logTitle 
    * 
    * @return array 
    */ 
    public function addTeamList($teamData, $repo, $em, $log, $logTitle) 
    { 
     foreach ($teamData as $team) { 
      // Get the current team in the list 
      $criteria = array('teamID' => $team['TeamID']); 
      //var_dump($criteria); 
      /** @var Team $storedTeam */ 
      $storedTeam = $repo->FindOneBy($criteria); 

      if (! $storedTeam) { 
       //no stadium exists with the StadiumID passed 
       //create a new entry 
       /** @var Team $entry */ 
       $entry = new Team(); 
       $entry->setTeamKey($team['Key']); 
       $entry->setTeamID($team['TeamID']); 
       $entry->setPlayerID($team['PlayerID']); 
       $entry->setCity($team['City']); 
       $entry->setName($team['Name']); 
       $entry->setConference($team['Conference']); 
       $entry->setDivision($team['Division']); 
       $entry->setFullName($team['FullName']); 
       $entry->setStadiumID($team['StadiumID']); 
       $entry->setByeWeek($team['ByeWeek']); 
       $entry->setAvergageDraftPos($team['AverageDraftPosition']); 
       $entry->setAverageDraftPosPPR($team['AverageDraftPositionPPR']); 
       $entry->setHeadCoach($team['HeadCoach']); 
       $entry->setOffensiveCoordinator($team['OffensiveCoordinator']); 
       $entry->setDefensiveCoordinator($team['DefensiveCoordinator']); 
       $entry->setSpecialTeamsCoach($team['SpecialTeamsCoach']); 
       $entry->setOffensiveScheme($team['OffensiveScheme']); 
       $entry->setDefensiveScheme($team['DefensiveScheme']); 
       $entry->setUpcomingSalary($team['UpcomingSalary']); 
       $entry->setUpcomingOpponentRank($team['UpcomingOpponentRank']); 
       $entry->setUpcomingOpponentPositionRank($team['UpcomingOpponentPositionRank']); 

       $em->persist($entry); 
       $logData = [ 'action' => 'Added New '.$logTitle , 'itemID' => $team['TeamID'], 'itemName' => $team['Name'] ]; 
       $log[] = $logData; 
      } else { 
       $storedTeam->setTeamKey($team['Key']); 
       $storedTeam->setPlayerID($team['PlayerID']); 
       $storedTeam->setCity($team['City']); 
       $storedTeam->setName($team['Name']); 
       $storedTeam->setConference($team['Conference']); 
       $storedTeam->setDivision($team['Division']); 
       $storedTeam->setFullName($team['FullName']); 
       $storedTeam->setStadiumID($team['StadiumID']); 
       $storedTeam->setByeWeek($team['ByeWeek']); 
       $storedTeam->setAvergageDraftPos($team['AverageDraftPosition']); 
       $storedTeam->setAverageDraftPosPPR($team['AverageDraftPositionPPR']); 
       $storedTeam->setHeadCoach($team['HeadCoach']); 
       $storedTeam->setOffensiveCoordinator($team['OffensiveCoordinator']); 
       $storedTeam->setDefensiveCoordinator($team['DefensiveCoordinator']); 
       $storedTeam->setSpecialTeamsCoach($team['SpecialTeamsCoach']); 
       $storedTeam->setOffensiveScheme($team['OffensiveScheme']); 
       $storedTeam->setDefensiveScheme($team['DefensiveScheme']); 
       $storedTeam->setUpcomingSalary($team['UpcomingSalary']); 
       $storedTeam->setUpcomingOpponentRank($team['UpcomingOpponentRank']); 
       $storedTeam->setUpcomingOpponentPositionRank($team['UpcomingOpponentPositionRank']); 

       $em->persist($storedTeam); 

       $logData = [ 'action' => 'Updated '.$logTitle , 'itemID' => $team['TeamID'], 'itemName' => $team['Name'] ]; 
       $log[] = $logData; 
      } 
     } 

     return $log; 
    } 

    /** 
    * @param Array $stadiumData 
    * @param $repo 
    * @param $em 
    * @param $log 
    * 
    * @return array 
    */ 
    public function addStadiumList($stadiumData, $repo, $em, $log) 
    { 
     foreach ($stadiumData as $stadium) { 
      // Get the current stadium in the list 
      $criteria = array('stadiumID' => $stadium['StadiumID']); 
      //var_dump($criteria); 
      /** @var Stadium $storedStadium */ 
      $storedStadium = $repo->FindOneBy($criteria); 

      if (! $storedStadium) { 
       //no stadium exists with the StadiumID passed 
       //create a new entry 
       /** @var Stadium $entry */ 
       $entry = new Stadium(); 
       $entry->setStadiumID($stadium['StadiumID']); 
       $entry->setName($stadium['Name']); 
       $entry->setCity($stadium['City']); 
       $entry->setState($stadium['State']); 
       $entry->setCountry($stadium['Country']); 
       $entry->setCapacity($stadium['Capacity']); 
       $entry->setPlayingSurface($stadium['PlayingSurface']); 
       $em->persist($entry); 
       $logData = [ 'action' => 'Added New Stadium', 
          'itemID' => $stadium['StadiumID'], 
          'itemName' => $stadium['Name'] 
       ]; 
       $log[] = $logData; 
      } else { 
       $storedStadium->setStadiumID($stadium['StadiumID']); 
       $storedStadium->setName($stadium['Name']); 
       $storedStadium->setCity($stadium['City']); 
       $storedStadium->setState($stadium['State']); 
       $storedStadium->setCountry($stadium['Country']); 
       $storedStadium->setCapacity($stadium['Capacity']); 
       $storedStadium->setPlayingSurface($stadium['PlayingSurface']); 
       $em->persist($storedStadium); 
       $logData = [ 'action' => 'Updated Stadium', 
          'itemID' => $stadium['StadiumID'], 
          'itemName' => $stadium['Name'] 
       ]; 
       $log[] = $logData; 
      } 
     } 

     return $log; 
    } 
} 

回答

1

來處理你的目的對我來說,最好的方法是創建擴展庫類的實體。

Symfony2 - Doctrine文檔

在你的情況,這可能是:

namespace SomeBundle\Repository; 

use Doctrine\ORM\EntityRepository; 

class PlayerRepository extends EntityRepository 
{ 
    /** 
    * @param Array $players 
    * @param  $playerRepo 
    * @param  $em 
    * @param Array $log 
    * 
    * @param String $logTitle 
    * 
    * @return array 
    */ 
    public function addPlayerList($players, $log, $logTitle) 
    { 
     foreach ($players as $player) { 
      // Get the current player in the list 
      $criteria = array('playerID' => $player['PlayerID']); 

      /** @var Player $storedPlayer */ 
      $storedPlayer = $this->findOneBy($criteria); 

      if (!$storedPlayer) { 
       $storedPlayer = new Player(); 

       $logData = [ 
        'action' => 'Added '.$logTitle, 
        'itemID' => $player['PlayerID'], 
        'itemName' => $player['Name'] 
       ]; 
       $log[] = $logData; 
      } else { 
       $logData = [ 
        'action' => 'Updated '.$logTitle, 
        'itemID' => $player['PlayerID'], 
        'itemName' => $player['Name'] 
       ]; 
       $log[] = $logData; 
      } 

      $storedPlayer->setPlayerID($player['PlayerID']); 
      $storedPlayer->setTeam($player['Team']); 
      $storedPlayer->setPlayerID($player['PlayerID']); 
      $storedPlayer->setNumber($player['Number']); 
      $storedPlayer->setFirstName($player['FirstName']); 
      $storedPlayer->setLastName($player['LastName']); 
      $storedPlayer->setPosition($player['Position']); 
      $storedPlayer->setStatus($player['Status']); 
      $storedPlayer->setHeight($player['Height']); 
      $storedPlayer->setWeight($player['Weight']); 
      //need to parse the date on this field 
      $storedPlayer->setBirthDate($this->parseDate($player['BirthDate'])); 
      $storedPlayer->setCollege($player['College']); 
      $storedPlayer->setExperience($player['Experience']); 
      $storedPlayer->setFantasyPosition($player['FantasyPosition']); 
      $storedPlayer->setActive($player['Active']); 
      $storedPlayer->setPositionCategory($player['PositionCategory']); 
      $storedPlayer->setName($player['Name']); 
      $storedPlayer->setAge($player['Age']); 
      $storedPlayer->setExperienceString($player['ExperienceString']); 
      $storedPlayer->setBirthDateString($player['BirthDateString']); 
      $storedPlayer->setPhotoUrl($player['PhotoUrl']); 
      $storedPlayer->setByeWeek($player['ByeWeek']); 
      $storedPlayer->setUpcomingGameOpponent($player['UpcomingGameOpponent']); 
      $storedPlayer->setUpcomingGameWeek($player['UpcomingGameWeek']); 
      $storedPlayer->setShortName($player['ShortName']); 
      $storedPlayer->setAverageDraftPos($player['AverageDraftPosition']); 
      $storedPlayer->setDepthPositionCategory($player['DepthPositionCategory']); 
      $storedPlayer->setDepthPosition($player['DepthOrder']); 
      $storedPlayer->setDepthDisplayOrder($player['DepthDisplayOrder']); 
      $storedPlayer->setCurrentTeam($player['CurrentTeam']); 
      $storedPlayer->setCollegeDraftTeam($player['CollegeDraftTeam']); 
      $storedPlayer->setCollegeDraftYear($player['CollegeDraftYear']); 
      $storedPlayer->setCollegeDraftRound($player['CollegeDraftRound']); 
      $storedPlayer->setCollegeDraftPick($player['CollegeDraftPick']); 
      $storedPlayer->setIsUndraftedFreeAgent($player['IsUndraftedFreeAgent']); 
      $storedPlayer->setHeightFeet($player['HeightFeet']); 
      $storedPlayer->setHeightInches($player['HeightInches']); 
      $storedPlayer->setUpcomingOpponentRank($player['UpcomingOpponentRank']); 
      $storedPlayer->setUpcomingOpponentPositionRank($player['UpcomingOpponentPositionRank']); 
      $storedPlayer->setCurrentStatus($player['CurrentStatus']); 
      $storedPlayer->setUpcomingSalary($player['UpcomingSalary']); 

     } 

     return ($log); 
    } 
} 

而且我自己,我會而創建的日期解析器類來解析日期此倉庫裏面像

$date = (new CustomDateTimeParser('your fancy date string here'))->getDateTime(); 
+0

那就是我最初認爲的最簡單的方法,然後我在很多地方讀到了這個版本庫只能用於獲取數據,而不是添加或修改exi蜇數據... –

+2

其實,也許。可能你應該創建一個將數組數據轉換爲'Player'實體的服務,如果你願意的話,可以使它變得更加靈活和可替換。爲此,您應該創建一個處理類並定義一個服務。 Look Service Container文檔http://symfony.com/doc/current/book/service_container.html。它應該看起來非常相似,但是您還應該傳遞一個'PlayerRepository'或'EntityManagerInterface'來獲取現有數據。 – ScayTrase

+0

是的,這聽起來像是一種很好的做事方式,儘管我擔心我最終會得到數百個服務,每個服務都做一件小事,也要感謝我的addPlayerList方法的簡化,它更緊湊,可管理 –