generator = $generator; $this->em = $em; $this->random = $random; } /** * {@inheritdoc} */ public function generate(FeedInterface $aggregate, User $user, $format, $page = null, $renew = false) { if (!$this->supports($aggregate)) { throw new InvalidArgumentException('AggregateLinkGenerator only support aggregate feeds.'); } switch ($format) { case self::FORMAT_ATOM: $params = [ 'token' => $this->getAggregateToken($user, $renew)->getValue(), 'format' => 'atom' ]; if (null !== $page) { $params['page'] = $page; } return new FeedLink( $this->generator->generate('feed_user_aggregated', $params, UrlGenerator::ABSOLUTE_URL), sprintf('%s - %s', $aggregate->getTitle(), 'Atom'), 'application/atom+xml' ); case self::FORMAT_RSS: $params = [ 'token' => $this->getAggregateToken($user, $renew)->getValue(), 'format' => 'rss' ]; if (null !== $page) { $params['page'] = $page; } return new FeedLink( $this->generator->generate('feed_user_aggregated', $params, UrlGenerator::ABSOLUTE_URL), sprintf('%s - %s', $aggregate->getTitle(), 'RSS'), 'application/rss+xml' ); default: throw new InvalidArgumentException(sprintf('Format %s is not recognized.', $format)); } } /** * {@inheritdoc} */ public function supports(FeedInterface $feed) { return $feed instanceof Aggregate; } /** * {@inheritdoc} */ public function generatePublic(FeedInterface $aggregate, $format, $page = null) { if (!$this->supports($aggregate)) { throw new InvalidArgumentException('AggregateLinkGenerator only support aggregate feeds.'); } switch ($format) { case self::FORMAT_ATOM: $params = ['format' => 'atom']; if (null !== $page) { $params['page'] = $page; } return new FeedLink( $this->generator->generate('feed_public_aggregated', $params, UrlGenerator::ABSOLUTE_URL), sprintf('%s - %s', $aggregate->getTitle(), 'Atom'), 'application/atom+xml' ); case self::FORMAT_RSS: $params = ['format' => 'rss']; if (null !== $page) { $params['page'] = $page; } return new FeedLink( $this->generator->generate('feed_public_aggregated', $params, UrlGenerator::ABSOLUTE_URL), sprintf('%s - %s', $aggregate->getTitle(), 'RSS'), 'application/rss+xml' ); default: throw new InvalidArgumentException(sprintf('Format %s is not recognized.', $format)); } } private function getAggregateToken(User $user, $renew = false) { $token = $this->em ->getRepository('Phraseanet:AggregateToken') ->findOneBy(['user' => $user]); if (null === $token || true === $renew) { if (null === $token) { $token = new AggregateToken(); $token->setUser($user); } $token->setValue($this->random->generateString(64, TokenManipulator::LETTERS_AND_NUMBERS)); $this->em->persist($token); $this->em->flush(); } return $token; } }