It is an action filter that can be added to a controller and handles the beforeAction event.
To use HttpCache, declare it in the behaviors() method of your controller class.
In the following example the filter will be applied to the list-action and
the Last-Modified header will contain the date of the last update to the user table in the database.
php
public function behaviors()
{
return [
[
'class' => 'yii\filters\HttpCache',
'only' => ['index'],
'lastModified' => function ($action, $params) {
$q = new \yii\db\Query();
return $q->from('user')->max('updated_at');
},
'etagSeed' => function ($action, $params) {
return // generate ETag seed here
}
],
];
}
/** * @covers yii\filters\HttpCache::generateEtag */ public function testGenerateEtag() { $httpCache = new HttpCache(); $httpCache->etagSeed = function ($action, $params) { return ''; }; $httpCache->beforeAction(null); $response = Yii::$app->getResponse(); $this->assertTrue($response->getHeaders()->offsetExists('ETag')); $etag = $response->getHeaders()->get('ETag'); $this->assertStringStartsWith('"', $etag); $this->assertStringEndsWith('"', $etag); }
/** * @inheritdoc */ public function behaviors() { return ['access' => ['class' => AccessControl::className(), 'only' => ['profile', 'return-to-edit', 'profile-to-pdf', 'spec-list', 'spec-items', 'agreement'], 'rules' => [['actions' => ['profile', 'return-to-edit', 'profile-to-pdf', 'spec-list', 'spec-items', 'agreement'], 'allow' => true, 'roles' => ['@']]]], 'verbs' => ['class' => VerbFilter::className(), 'actions' => ['return-to-edit' => ['post']]], ['class' => \yii\filters\HttpCache::className(), 'only' => ['view'], 'lastModified' => function ($action, $params) { $q = new \yii\db\Query(); return $q->from('profile')->max('updated_at'); }]]; }
/** * @inheritdoc */ public function behaviors() { $behaviors = ArrayHelper::merge(parent::behaviors(), ['authenticator' => ['class' => CompositeAuth::className(), 'authMethods' => [['class' => HttpBearerAuth::className()], ['class' => QueryParamAuth::className(), 'tokenParam' => 'accessToken']]], 'exceptionFilter' => ['class' => ErrorToExceptionFilter::className()], 'corsFilter' => ['class' => \backend\rest\filters\Cors::className(), 'cors' => ['Origin' => ['*'], 'Access-Control-Request-Method' => ['POST', 'PUT', 'OPTIONS', 'PATCH', 'DELETE'], 'Access-Control-Request-Headers' => ['X-Pagination-Total-Count', 'X-Pagination-Page-Count', 'X-Pagination-Current-Page', 'X-Pagination-Per-Page', 'Content-Length', 'Content-type', 'Link'], 'Access-Control-Allow-Credentials' => true, 'Access-Control-Max-Age' => 3600, 'Access-Control-Expose-Headers' => ['X-Pagination-Total-Count', 'X-Pagination-Page-Count', 'X-Pagination-Current-Page', 'X-Pagination-Per-Page', 'Content-Length', 'Content-type', 'Link'], 'Access-Control-Allow-Headers' => ['X-Pagination-Total-Count', 'X-Pagination-Page-Count', 'X-Pagination-Current-Page', 'X-Pagination-Per-Page', 'Content-Length', 'Content-type', 'Link']]]]); if (isset(\Yii::$app->params['httpCacheActive']) and \Yii::$app->params['httpCacheActive']) { $params = \Yii::$app->getRequest()->getQueryParams(); unset($params['accessToken']); $behaviors['httpCache'] = ['class' => HttpCache::className(), 'params' => $params, 'lastModified' => function ($action, $params) { $q = new \yii\db\Query(); $class = $this->modelClass; if (in_array('updated_at', $class::getTableSchema()->getColumnNames())) { return strtotime($q->from($class::tableName())->max('updated_at')); } if (in_array('modified', $class::getTableSchema()->getColumnNames())) { return strtotime($q->from($class::tableName())->max('modified')); } return null; }, 'etagSeed' => function (Action $action, $params) { $iterator = new \RecursiveIteratorIterator(new \RecursiveArrayIterator($params)); $keys = array(); foreach ($iterator as $key => $value) { // Build long key name based on parent keys for ($i = $iterator->getDepth() - 1; $i >= 0; $i--) { $key = $iterator->getSubIterator($i)->key() . '_' . $key; if (!is_array($iterator->getSubIterator($i)->current())) { $value = $iterator->getSubIterator($i)->current() . '_' . $value; } } $keys[] = $key . '-' . $value; } $uniqueId = implode('-', $keys); return $uniqueId; }]; } return $behaviors; }
public function behaviors() { return ['httpCache' => ['class' => \yii\filters\HttpCache::className(), 'only' => ['index']]]; }