Security update for Core, with self-updated composer
[yaffs-website] / vendor / zendframework / zend-feed / src / Writer / FeedFactory.php
1 <?php
2 /**
3  * Zend Framework (http://framework.zend.com/)
4  *
5  * @link      http://github.com/zendframework/zf2 for the canonical source repository
6  * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
7  * @license   http://framework.zend.com/license/new-bsd New BSD License
8  */
9
10 namespace Zend\Feed\Writer;
11
12 use Traversable;
13
14 abstract class FeedFactory
15 {
16     /**
17      * Create and return a Feed based on data provided.
18      *
19      * @param  array|Traversable $data
20      * @throws Exception\InvalidArgumentException
21      * @return Feed
22      */
23     public static function factory($data)
24     {
25         if (! is_array($data) && ! $data instanceof Traversable) {
26             throw new Exception\InvalidArgumentException(sprintf(
27                 '%s expects an array or Traversable argument; received "%s"',
28                 __METHOD__,
29                 (is_object($data) ? get_class($data) : gettype($data))
30             ));
31         }
32
33         $feed = new Feed();
34
35         foreach ($data as $key => $value) {
36             // Setters
37             $key    = static::convertKey($key);
38             $method = 'set' . $key;
39             if (method_exists($feed, $method)) {
40                 switch ($method) {
41                     case 'setfeedlink':
42                         if (! is_array($value)) {
43                             // Need an array
44                             break;
45                         }
46                         if (! array_key_exists('link', $value) || ! array_key_exists('type', $value)) {
47                             // Need both keys to set this correctly
48                             break;
49                         }
50                         $feed->setFeedLink($value['link'], $value['type']);
51                         break;
52                     default:
53                         $feed->$method($value);
54                         break;
55                 }
56                 continue;
57             }
58
59             // Entries
60             if ('entries' == $key) {
61                 static::createEntries($value, $feed);
62                 continue;
63             }
64         }
65
66         return $feed;
67     }
68
69     /**
70      * Normalize a key
71      *
72      * @param  string $key
73      * @return string
74      */
75     protected static function convertKey($key)
76     {
77         $key = str_replace('_', '', strtolower($key));
78         return $key;
79     }
80
81     /**
82      * Create and attach entries to a feed
83      *
84      * @param  array|Traversable $entries
85      * @param  Feed $feed
86      * @throws Exception\InvalidArgumentException
87      * @return void
88      */
89     protected static function createEntries($entries, Feed $feed)
90     {
91         if (! is_array($entries) && ! $entries instanceof Traversable) {
92             throw new Exception\InvalidArgumentException(sprintf(
93                 '%s::factory expects the "entries" value to be an array or Traversable; received "%s"',
94                 get_called_class(),
95                 (is_object($entries) ? get_class($entries) : gettype($entries))
96             ));
97         }
98
99         foreach ($entries as $data) {
100             if (! is_array($data) && ! $data instanceof Traversable && ! $data instanceof Entry) {
101                 throw new Exception\InvalidArgumentException(sprintf(
102                     '%s expects an array, Traversable, or Zend\Feed\Writer\Entry argument; received "%s"',
103                     __METHOD__,
104                     (is_object($data) ? get_class($data) : gettype($data))
105                 ));
106             }
107
108             // Use case 1: Entry item
109             if ($data instanceof Entry) {
110                 $feed->addEntry($data);
111                 continue;
112             }
113
114             // Use case 2: iterate item and populate entry
115             $entry = $feed->createEntry();
116             foreach ($data as $key => $value) {
117                 $key    = static::convertKey($key);
118                 $method = 'set' . $key;
119                 if (! method_exists($entry, $method)) {
120                     continue;
121                 }
122                 $entry->$method($value);
123             }
124             $feed->addEntry($entry);
125         }
126     }
127 }