3 All notable changes to this project will be documented in this file, in reverse chronological order by release.
13 - This release modifies how `Zend\Feed\Pubsubhubbub\AbstractCallback::_detectCallbackUrl()`
14 marshals the request URI. In prior releases, we would attempt to inspect the
15 `X-Rewrite-Url` and `X-Original-Url` headers, using their values, if present.
16 These headers are issued by the ISAPI_Rewrite module for IIS (developed by
17 HeliconTech). However, we have no way of guaranteeing that the module is what
18 issued the headers, making it an unreliable source for discovering the URI. As
19 such, we have removed this feature in this release.
21 The method is not called internally. If you are calling the method from your
22 own extension and need support for ISAPI_Rewrite, you will need to override
23 the method as follows:
26 protected function _detectCallbackUrl()
29 if (isset($_SERVER['HTTP_X_REWRITE_URL'])) {
30 $callbackUrl = $_SERVER['HTTP_X_REWRITE_URL'];
32 if (isset($_SERVER['HTTP_X_ORIGINAL_URL'])) {
33 $callbackUrl = $_SERVER['HTTP_X_ORIGINAL_URL'];
36 return $callbackUrl ?: parent::__detectCallbackUrl();
40 If you use an approach such as the above, make sure you also instruct your web
41 server to strip any incoming headers of the same name so that you can
42 guarantee they are issued by the ISAPI_Rewrite module.
56 ## 2.10.2 - 2018-06-18
76 - [#81](https://github.com/zendframework/zend-feed/pull/81) updates the `Zend\Feed\Reader\Reader` and `Zend\Feed\Writer\Writer` classes to
77 conditionally register their respective "GooglePlayPodcast" extensions only if
78 their extension managers are aware of it. This is done due to the fact that
79 existing `ExtensionManagerInterface` implementations may not register it by
80 default as the extension did not exist in releases prior to 2.10.0. By having
81 the registration conditional, we prevent an exception from being raised; users
82 are not impacted by its absence, as the extension features were not exposed
85 Both `Reader` and `Writer` emit an `E_USER_NOTICE` when the extension is not
86 found in the extension manager, indicating that the
87 `ExtensionManagerInterface` implementation should be updated to add entries
88 for the "GooglePlayPodcast" entry, feed, and/or renderer classes.
90 ## 2.10.1 - 2018-06-05
110 - [#79](https://github.com/zendframework/zend-feed/pull/79) fixes an issue in the `setType()` method of the iTunes feed renderer whereby it was setting
111 the DOM content with an uninitialized variable.
113 ## 2.10.0 - 2018-05-24
117 - [#78](https://github.com/zendframework/zend-feed/pull/78) adds support for the Google Play Podcasts 1.0 DTD in both the Reader and
118 Writer subcomponents. The following new classes provide the support:
120 - `Zend\Feed\Reader\Extension\GooglePlayPodcast\Entry`
121 - `Zend\Feed\Reader\Extension\GooglePlayPodcast\Feed`
122 - `Zend\Feed\Writer\Extension\GooglePlayPodcast\Entry`
123 - `Zend\Feed\Writer\Extension\GooglePlayPodcast\Feed`
124 - `Zend\Feed\Writer\Extension\GooglePlayPodcast\Renderer\Entry`
125 - `Zend\Feed\Writer\Extension\GooglePlayPodcast\Renderer\Feed`
127 The extensions are registered by default with both `Zend\Feed\Reader\Reader`
128 and `Zend\Feed\Writer\Writer`.
130 - [#77](https://github.com/zendframework/zend-feed/pull/77) adds support for `itunes:image` for each of:
131 - `Zend\Feed\Reader\Extension\Podcast\Entry`, via `getItunesImage()`; previously only the `Feed` supported it.
132 - `Zend\Feed\Writer\Extension\ITunes\Entry`, via `setItunesImage()`; previously only the `Feed` supported it.
133 - `Zend\Feed\Writer\Extension\ITunes\Renderer\Entry`; previously on the `Feed` supported it.
135 - [#75](https://github.com/zendframework/zend-feed/pull/75) adds `Zend\Feed\Writer\Extension\ITunes\Entry::setItunesSeason()`, corresponding to the
136 `itunes:season` tag, and allowing setting the season number of the episode the
139 - [#75](https://github.com/zendframework/zend-feed/pull/75) adds `Zend\Feed\Writer\Extension\ITunes\Entry::setItunesIsClosedCaptioned()`, corresponding to the
140 `itunes:isClosedCaptioned` tag, and allowing setting the status of closed
141 captioning support in the episode the entry represents.
143 - [#75](https://github.com/zendframework/zend-feed/pull/75) adds `Zend\Feed\Writer\Extension\ITunes\Entry::setItunesEpisodeType()`, corresponding to the
144 `itunes:episodeType` tag, and allowing setting the type of episode the entry represents
145 (one of "full", "trailer", or "bonus", and defaulting to "full").
147 - [#75](https://github.com/zendframework/zend-feed/pull/75) adds `Zend\Feed\Writer\Extension\ITunes\Entry::setEpisode()`, corresponding to the
148 `itunes:episode` tag, and allowing setting the number of the episode the entry represents.
150 - [#75](https://github.com/zendframework/zend-feed/pull/75) adds `Zend\Feed\Writer\Extension\ITunes\Feed::setItunesComplete()`, corresponding to the
151 `itunes:complete` tag. It allows setting a boolean flag, indicating whether or not the
152 podcast is complete (will not air new episodes).
154 - [#75](https://github.com/zendframework/zend-feed/pull/75) adds `Zend\Feed\Writer\Extension\ITunes\Feed::setItunesType()`, corresponding to the
155 `itunes:type` tag, and allowing setting the podcast type (one of "serial" or "episodic").
157 - [#75](https://github.com/zendframework/zend-feed/pull/75) adds `Zend\Feed\Reader\Extension\Podcast\Entry::getEpisodeType()`, corresponding to the
158 `itunes:episodeType` tag, and returning the type of episode the entry represents
159 (one of "full", "trailer", or "bonus", and defaulting to "full").
161 - [#75](https://github.com/zendframework/zend-feed/pull/75) adds `Zend\Feed\Reader\Extension\Podcast\Entry::getSeason()`, corresponding to the
162 `itunes:season` tag, and returning the season number of the episode the entry represents.
164 - [#75](https://github.com/zendframework/zend-feed/pull/75) adds `Zend\Feed\Reader\Extension\Podcast\Entry::isClsoedCaptioned()`, corresponding to the
165 `itunes:isClosedCaptioned` tag, and returning the status of closed captioning
166 in the episode the entry represents.
168 - [#75](https://github.com/zendframework/zend-feed/pull/75) adds `Zend\Feed\Reader\Extension\Podcast\Entry::getEpisode()`, corresponding to the
169 `itunes:episode` tag, and returning the number of the episode the entry represents.
171 - [#75](https://github.com/zendframework/zend-feed/pull/75) adds `Zend\Feed\Reader\Extension\Podcast\Feed::isComplete()`, corresponding to the
172 `itunes:complete` tag. It returns a boolean, indicating whether or not the podcast is
173 complete (will not air new episodes).
175 - [#75](https://github.com/zendframework/zend-feed/pull/75) adds `Zend\Feed\Reader\Extension\Podcast\Feed::getPodcastType()`, corresponding to the
176 `itunes:type` tag, and providing the podcast type (one of "serial" or "episodic", defaulting
181 - [#77](https://github.com/zendframework/zend-feed/pull/77) updates URI validation for `Zend\Feed\Writer\Extension\ITunes\Feed::setItunesImage()` to
182 first check that we have received a string value before proceeding.
186 - [#75](https://github.com/zendframework/zend-feed/pull/75) deprecates each of:
187 - `Zend\Feed\Reader\Extension\Podcast\Entry::getKeywords()`
188 - `Zend\Feed\Reader\Extension\Podcast\Feed::getKeywords()`
189 - `Zend\Feed\Writer\Extension\ITunes\Entry::setKeywords()`
190 - `Zend\Feed\Writer\Extension\ITunes\Feed::setKeywords()`
191 as the iTunes Podcast RSS specification no longer supports keywords.
201 ## 2.9.1 - 2018-05-14
209 - [#16](https://github.com/zendframework/zend-feed/pull/16) updates the `Zend\Feed\Pubsubhubbub\AbstractCallback` to no longer use the
210 `$GLOBALS['HTTP_RAW_POST_DATA']` value as a fallback when `php://input` is
211 empty. The fallback existed because, prior to PHP 5.6, `php://input` could
212 only be read once. As we now require PHP 5.6, the fallback is unnecessary,
213 and best removed as the globals value is deprecated.
225 - [#68](https://github.com/zendframework/zend-feed/pull/68) fixes the behavior of `Zend\Feed\Writer\AbstractFeed::setTitle()` and
226 `Zend\Feed\Writer\Entry::setTitle()` to accept the string `"0"`.
228 - [#68](https://github.com/zendframework/zend-feed/pull/68) updates both `Zend\Feed\Writer\AbstractFeed` and `Zend\Feed\Writer\Entry`
229 to no longer throw an exception for entry titles which have a string value of `0`.
231 ## 2.9.0 - 2017-12-04
235 - [#52](https://github.com/zendframework/zend-feed/pull/52) adds support for PHP
238 - [#53](https://github.com/zendframework/zend-feed/pull/53) adds a number of
239 additional aliases to the `Writer\ExtensionPluginManager` to ensure plugins
240 will be pulled as expected.
242 - [#63](https://github.com/zendframework/zend-feed/pull/63) adds the feed title
243 to the attributes incorporated in the `FeedSet` instance, per what was already
246 - [#55](https://github.com/zendframework/zend-feed/pull/55) makes two API
247 additions to the `StandaloneExtensionManager` implementations of both the reader
248 and writer subcomponents:
250 - `$manager->add($name, $class)` will add an extension class using the
252 - `$manager->remove($name)` will remove an existing extension by the provided
265 - [#52](https://github.com/zendframework/zend-feed/pull/52) removes support for
270 - [#50](https://github.com/zendframework/zend-feed/pull/50) fixes a few issues
271 in the PubSubHubbub `Subscription` model where counting was being performed on
272 uncountable data; this ensures the subcomponent will work correctly under PHP
275 ## 2.8.0 - 2017-04-02
279 - [#27](https://github.com/zendframework/zend-feed/pull/27) adds a documentation
280 chapter demonstrating wrapping a PSR-7 client to use with `Zend\Feed\Reader`.
281 - [#22](https://github.com/zendframework/zend-feed/pull/22) adds missing
282 ExtensionManagerInterface on Writer\ExtensionPluginManager.
283 - [#32](https://github.com/zendframework/zend-feed/pull/32) adds missing
284 ExtensionManagerInterface on Reader\ExtensionPluginManager.
292 - [#38](https://github.com/zendframework/zend-feed/pull/38) dropped php 5.5
297 - [#35](https://github.com/zendframework/zend-feed/pull/35) fixed
298 "A non-numeric value encountered" in php 7.1
299 - [#39](https://github.com/zendframework/zend-feed/pull/39) fixed protocol
300 relative link absolutisation
301 - [#40](https://github.com/zendframework/zend-feed/pull/40) fixed service
302 manager v3 compatibility aliases in extension plugin managers
304 ## 2.7.0 - 2016-02-11
308 - [#21](https://github.com/zendframework/zend-feed/pull/21) edits, revises, and
309 prepares the documentation for publication at https://zendframework.github.io/zend-feed/
321 - [#20](https://github.com/zendframework/zend-feed/pull/20) makes the two
322 zend-servicemanager extension manager implementations forwards compatible
323 with version 3, and the overall code base forwards compatible with zend-stdlib
326 ## 2.6.0 - 2015-11-24
330 - [#13](https://github.com/zendframework/zend-feed/pull/13) introduces
331 `Zend\Feed\Writer\StandaloneExtensionManager`, an implementation of
332 `Zend\Feed\Writer\ExtensionManagerInterface` that has no dependencies.
333 `Zend\Feed\Writer\ExtensionManager` now composes this by default, instead of
334 `Zend\Feed\Writer\ExtensionPluginManager`, for managing the various feed and
335 entry extensions. If you relied on `ExtensionPluginManager` previously, you
336 will need to create an instance manually and inject it into the `Writer`
338 - [#14](https://github.com/zendframework/zend-feed/pull/14) introduces:
339 - `Zend\Feed\Reader\Http\HeaderAwareClientInterface`, which extends
340 `ClientInterface` and adds an optional argument to the `get()` method,
341 `array $headers = []`; this argument allows specifying request headers for
342 the client to send. `$headers` should have header names for keys, and the
343 values should be arrays of strings/numbers representing the header values
344 (if only a single value is necessary, it should be represented as an single
346 - `Zend\Feed\Reader\Http\HeaderAwareResponseInterface`, which extends
347 `ResponseInterface` and adds the method `getHeader($name, $default = null)`.
348 Clients may return either a `ResponseInterface` or
349 `HeaderAwareResponseInterface` instance.
350 - `Zend\Feed\Reader\Http\Response`, which is an implementation of
351 `HeaderAwareResponseInterface`. Its constructor accepts the status code,
352 body, and, optionally, headers.
353 - `Zend\Feed\Reader\Http\Psr7ResponseDecorator`, which is an implementation of
354 `HeaderAwareResponseInterface`. Its constructor accepts a PSR-7 response
355 instance, and the various methdos then proxy to those methods. This should
356 make creating wrappers for PSR-7 HTTP clients trivial.
357 - `Zend\Feed\Reader\Http\ZendHttpClientDecorator`, which decorates a
358 `Zend\Http\Client` instance, implements `HeaderAwareClientInterface`, and
359 returns a `Response` instance seeded from the zend-http response upon
360 calling `get()`. The class exposes a `getDecoratedClient()` method to allow
361 retrieval of the decorated zend-http client instance.
373 - [#5](https://github.com/zendframework/zend-feed/pull/5) fixes the enclosure
374 length check to allow zero and integer strings.
375 - [#2](https://github.com/zendframework/zend-feed/pull/2) ensures that the
376 routine for "absolutising" a link in `Reader\FeedSet` always generates a URI
378 - [#14](https://github.com/zendframework/zend-feed/pull/14) makes the following
379 changes to fix behavior around HTTP clients used within
380 `Zend\Feed\Reader\Reader`:
381 - `setHttpClient()` now ensures that the passed client is either a
382 `Zend\Feed\Reader\Http\ClientInterface` or `Zend\Http\Client`, raising an
383 `InvalidArgumentException` if neither. If a `Zend\Http\Client` is passed, it
384 is passed to the constructor of `Zend\Feed\Reader\Http\ZendHttpClientDecorator`,
385 and the decorator instance is used.
386 - `getHttpClient()` now *always* returns a `Zend\Feed\Reader\Http\ClientInterface`
387 instance. If no instance is currently registered, it lazy loads a
388 `ZendHttpClientDecorator` instance.
389 - `import()` was updated to consume a `ClientInterface` instance; when caches
390 are in play, it checks the client against `HeaderAwareClientInterface` to
391 determine if it can check for HTTP caching headers, and, if so, to retrieve
393 - `findFeedLinks()` was updated to consume a `ClientInterface`.