1: <?php
2: /**
3: * Slim - a micro PHP 5 framework
4: *
5: * @author Josh Lockhart <info@slimframework.com>
6: * @copyright 2011 Josh Lockhart
7: * @link http://www.slimframework.com
8: * @license http://www.slimframework.com/license
9: * @version 2.2.0
10: * @package Slim
11: *
12: * MIT LICENSE
13: *
14: * Permission is hereby granted, free of charge, to any person obtaining
15: * a copy of this software and associated documentation files (the
16: * "Software"), to deal in the Software without restriction, including
17: * without limitation the rights to use, copy, modify, merge, publish,
18: * distribute, sublicense, and/or sell copies of the Software, and to
19: * permit persons to whom the Software is furnished to do so, subject to
20: * the following conditions:
21: *
22: * The above copyright notice and this permission notice shall be
23: * included in all copies or substantial portions of the Software.
24: *
25: * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
26: * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
27: * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
28: * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
29: * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
30: * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
31: * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
32: */
33: namespace Slim\Middleware;
34:
35: /**
36: * HTTP Method Override
37: *
38: * This is middleware for a Slim application that allows traditional
39: * desktop browsers to submit psuedo PUT and DELETE requests by relying
40: * on a pre-determined request parameter. Without this middleware,
41: * desktop browsers are only able to submit GET and POST requests.
42: *
43: * This middleware is included automatically!
44: *
45: * @package Slim
46: * @author Josh Lockhart
47: * @since 1.6.0
48: */
49: class MethodOverride extends \Slim\Middleware
50: {
51: /**
52: * @var array
53: */
54: protected $settings;
55:
56: /**
57: * Constructor
58: * @param \Slim $app
59: * @param array $settings
60: */
61: public function __construct($settings = array())
62: {
63: $this->settings = array_merge(array('key' => '_METHOD'), $settings);
64: }
65:
66: /**
67: * Call
68: *
69: * Implements Slim middleware interface. This method is invoked and passed
70: * an array of environment variables. This middleware inspects the environment
71: * variables for the HTTP method override parameter; if found, this middleware
72: * modifies the environment settings so downstream middleware and/or the Slim
73: * application will treat the request with the desired HTTP method.
74: *
75: * @param array $env
76: * @return array[status, header, body]
77: */
78: public function call()
79: {
80: $env = $this->app->environment();
81: if (isset($env['X_HTTP_METHOD_OVERRIDE'])) {
82: // Header commonly used by Backbone.js and others
83: $env['slim.method_override.original_method'] = $env['REQUEST_METHOD'];
84: $env['REQUEST_METHOD'] = strtoupper($env['X_HTTP_METHOD_OVERRIDE']);
85: } elseif (isset($env['REQUEST_METHOD']) && $env['REQUEST_METHOD'] === 'POST') {
86: // HTML Form Override
87: $req = new \Slim\Http\Request($env);
88: $method = $req->post($this->settings['key']);
89: if ($method) {
90: $env['slim.method_override.original_method'] = $env['REQUEST_METHOD'];
91: $env['REQUEST_METHOD'] = strtoupper($method);
92: }
93: }
94: $this->next->call();
95: }
96: }
97: