1. In Yii2, the error “Call to undefined method Closure::evaluateDependency()” occurs. See Figure 1.

2. I added page caching to the detail page corresponding to the view method. The code implementation is as follows:
PHP
// 新增 fileCache 组件,用于页面缓存等大数据内容
'fileCache' => [
'class' => 'yii\caching\FileCache',
'cachePath' => '@runtime/cache/pages', // 可自定义路径
'directoryLevel' => 2, // 默认即可,便于分目录管理文件
],
PHP
use yii\caching\DbDependency;
use yii\filters\PageCache;
public function behaviors()
{
return [
'pageCache' => [
'class' => PageCache::class,
'only' => ['view'], // 仅缓存 view 动作
'duration' => 300, // 缓存 5 分钟
'variations' => [
Yii::$app->request->get('id'),
Yii::$app->request->get('alias'),
],
'dependency' => function () {
$alias = Yii::$app->request->get('alias');
$id = Yii::$app->request->get('id');
if (!empty($alias)) {
return new DbDependency([
'sql' => 'SELECT updated_at FROM use_cases WHERE alias = :alias LIMIT 1',
'params' => [':alias' => $alias],
]);
} elseif (!empty($id)) {
return new DbDependency([
'sql' => 'SELECT updated_at FROM use_cases WHERE id = :id LIMIT 1',
'params' => [':id' => $id],
]);
}
return null; // 不缓存
},
'cache' => 'fileCache', // 指定使用 file 缓存组件
],
];
}
3. The current Yii2 version is 2.0.50. Instead of passing a closure directly to dependency, I generate the dependency instance outside the behavior first.
PHP
public function behaviors()
{
$alias = Yii::$app->request->get('alias');
$id = Yii::$app->request->get('id');
if (!empty($alias)) {
$dependency = new DbDependency([
'sql' => 'SELECT updated_at FROM use_cases WHERE alias = :alias LIMIT 1',
'params' => [':alias' => $alias],
]);
} elseif (!empty($id)) {
$dependency = new DbDependency([
'sql' => 'SELECT updated_at FROM use_cases WHERE id = :id LIMIT 1',
'params' => [':id' => $id],
]);
} else {
// 不缓存或默认缓存依赖
$dependency = null;
}
return [
'pageCache' => [
'class' => PageCache::class,
'only' => ['view'],
'duration' => 300,
'variations' => [
$id,
$alias,
],
'dependency' => $dependency,
'cache' => 'fileCache',
],
];
}
4. The error no longer occurs. Checking the Debug Log shows “Valid page content is found in the cache.” This confirms that the page caching is working as expected. See Figure 2.

5. Checking the frontend/runtime/cache/pages directory confirms that the corresponding page cache has been generated. See Figure 3.

