我慢慢開始理解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;
}
}
那就是我最初認爲的最簡單的方法,然後我在很多地方讀到了這個版本庫只能用於獲取數據,而不是添加或修改exi蜇數據... –
其實,也許。可能你應該創建一個將數組數據轉換爲'Player'實體的服務,如果你願意的話,可以使它變得更加靈活和可替換。爲此,您應該創建一個處理類並定義一個服務。 Look Service Container文檔http://symfony.com/doc/current/book/service_container.html。它應該看起來非常相似,但是您還應該傳遞一個'PlayerRepository'或'EntityManagerInterface'來獲取現有數據。 – ScayTrase
是的,這聽起來像是一種很好的做事方式,儘管我擔心我最終會得到數百個服務,每個服務都做一件小事,也要感謝我的addPlayerList方法的簡化,它更緊湊,可管理 –