Qiang Xue
12 years ago
2 changed files with 92 additions and 2 deletions
@ -0,0 +1,90 @@
|
||||
<?php |
||||
/** |
||||
* @link http://www.yiiframework.com/ |
||||
* @copyright Copyright (c) 2008 Yii Software LLC |
||||
* @license http://www.yiiframework.com/license/ |
||||
*/ |
||||
|
||||
namespace yii\web; |
||||
|
||||
use Yii; |
||||
use yii\base\ActionEvent; |
||||
use yii\base\Behavior; |
||||
use yii\base\HttpException; |
||||
|
||||
/** |
||||
* VerbFilter is an action filter that filters by HTTP request methods. |
||||
* |
||||
* It allows to define allowed HTTP request methods for each action and will throw |
||||
* an HTTP 405 error when the method is not allowed. |
||||
* |
||||
* To use VerbFilter, declare it in the `behaviors()` method of your controller class. |
||||
* For example, the following declarations will define a typical set of allowed |
||||
* request methods for REST CRUD actions. |
||||
* |
||||
* ~~~ |
||||
* public function behaviors() |
||||
* { |
||||
* return array( |
||||
* 'verbs' => array( |
||||
* 'class' => \yii\web\VerbFilter::className(), |
||||
* 'actions' => array( |
||||
* 'index' => array('get'), |
||||
* 'view' => array('get'), |
||||
* 'create' => array('get', 'post'), |
||||
* 'update' => array('get', 'put', 'post'), |
||||
* 'delete' => array('post', 'delete'), |
||||
* ), |
||||
* ), |
||||
* ); |
||||
* } |
||||
* ~~~ |
||||
* |
||||
* @see http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.7 |
||||
* @author Carsten Brandt <mail@cebe.cc> |
||||
* @since 2.0 |
||||
*/ |
||||
class VerbFilter extends Behavior |
||||
{ |
||||
/** |
||||
* @var array this property defines the allowed request methods for each action. |
||||
* For each action that should only support limited set of request methods |
||||
* you add an entry with the action id as array key and an array of |
||||
* allowed methods (e.g. GET, HEAD, PUT) as the value. |
||||
* If an action is not listed all request methods are considered allowed. |
||||
*/ |
||||
public $actions = array(); |
||||
|
||||
|
||||
/** |
||||
* Declares event handlers for the [[owner]]'s events. |
||||
* @return array events (array keys) and the corresponding event handler methods (array values). |
||||
*/ |
||||
public function events() |
||||
{ |
||||
return array( |
||||
Controller::EVENT_BEFORE_ACTION => 'beforeAction', |
||||
); |
||||
} |
||||
|
||||
/** |
||||
* @param ActionEvent $event |
||||
* @return boolean |
||||
* @throws \yii\base\HttpException when the request method is not allowed. |
||||
*/ |
||||
public function beforeAction($event) |
||||
{ |
||||
$action = $event->action->id; |
||||
if (isset($this->actions[$action])) { |
||||
$verb = Yii::$app->getRequest()->getRequestMethod(); |
||||
$allowed = array_map('strtoupper', $this->actions[$action]); |
||||
if (!in_array($verb, $allowed)) { |
||||
$event->isValid = false; |
||||
// http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.7 |
||||
header('Allow: ' . implode(', ', $allowed)); |
||||
throw new HttpException(405, 'Method Not Allowed. This url can only handle the following request methods: ' . implode(', ', $allowed)); |
||||
} |
||||
} |
||||
return $event->isValid; |
||||
} |
||||
} |
Loading…
Reference in new issue