public function saveImpressionsAction(Request $request) { $this->_throwUnsupportedMethodIfNotPost($request); $form = $this->createForm(new TrackerFormType()); $form->bind($request); // invalid form if (!$form->isValid()) { $this->_throwHttpException(400, 'Invalid form'); } $impressions = $request->get('impressions', array()); if (!\count($impressions)) { return new Response('Empty impressions', 200); //$this->_throwHttpException(400, 'Empty impressions'); } $trackerFactory = $this->get('factory.statistics.dailyTracker'); $trackersUsed = array(); // add impressions to daily trackers foreach ($impressions as $_encodedImpression) { $decodedImpression = StatisticParameters::decodeParameters($_encodedImpression); // no statisic type parameter, or invalid type if (!$decodedImpression->has(StatisticParameters::TYPE) || !StatisticTypes::isValidType($decodedImpression->get(StatisticParameters::TYPE))) { // lets skip this for now. continue; } if (!isset($trackersUsed[$decodedImpression->get(StatisticParameters::TYPE)])) { $trackersUsed[$decodedImpression->get(StatisticParameters::TYPE)] = $trackerFactory->getTrackerByType($decodedImpression->get(StatisticParameters::TYPE)); } $tracker = $trackersUsed[$decodedImpression->get(StatisticParameters::TYPE)]; if ($data = $tracker->createDataFromParameters($decodedImpression)) { // $em = $this->getDoctrine()->getEntityManager('statistics'); // $em->persist($data); // $em->flush(); // return $this->render('::base.ajaxDebugger.html.twig'); // var_dump($data); exit; $tracker->add($data); } } // batch save the impressions foreach ($trackersUsed as $tracker) { try { $tracker->batchSave(); } catch (\Exception $e) { // log this exception } } return new Response('Impressions saved', 200); }
private function _initializeTypes() { static $hasInitialized = false; if (!$hasInitialized) { foreach (StatisticTypes::getTrackerClasses() as $_type => $_class) { if (!\class_exists($_class)) { throw TrackerException::trackerClassDoesNotExist($_class); } $_tracker = new $_class(); if (!$_tracker instanceof Tracker) { throw TrackerException::invalidTrackerClass($_tracker); } // inject dependencies $_tracker->setDoctrine($this->doctrine); $this->trackers[$_type] = $_tracker; } $hasInitialized = true; } }
const INSTITUTION_MEDICAL_CENTER = 3; // statistic type for items appearing as search results const SEARCH_RESULT_ITEM = 4; private static $types = array(); private static $trackerClasses = array(); private static $typesByRoutes = array(); public static function isValidType($type) { return \array_key_exists($type, self::$types); } public static function getTypes() { return static::$types; } public static function getTrackerClasses() { return static::$trackerClasses; } public static function getTypeByRoute($route) { return isset(static::$typesByRoutes[$route]) ? static::$typesByRoutes[$route] : null; } public static function _initializeTypes() { static::$types = array(self::ADVERTISEMENT => 'Advertisement', self::INSTITUTION => 'Institution', self::INSTITUTION_MEDICAL_CENTER => 'Institution Medical Center', self::SEARCH_RESULT_ITEM => 'Search Results Item'); static::$trackerClasses = array(StatisticTypes::ADVERTISEMENT => '\\HealthCareAbroad\\StatisticsBundle\\Services\\Trackers\\AdvertisementTracker', StatisticTypes::INSTITUTION => '\\HealthCareAbroad\\StatisticsBundle\\Services\\Trackers\\InstitutionTracker', StatisticTypes::INSTITUTION_MEDICAL_CENTER => '\\HealthCareAbroad\\StatisticsBundle\\Services\\Trackers\\InstitutionMedicalCenterTracker', StatisticTypes::SEARCH_RESULT_ITEM => '\\HealthCareAbroad\\StatisticsBundle\\Services\\Trackers\\SearchResultItemTracker'); static::$typesByRoutes = array('frontend_institution_multipleCenter_profile' => self::INSTITUTION, 'frontend_institution_singleCenter_profile' => self::INSTITUTION, 'frontend_institutionMedicalCenter_profile' => self::INSTITUTION_MEDICAL_CENTER); } } StatisticTypes::_initializeTypes();