• 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧

Yii 中特殊行为 ActionFilter 的使用示例

互联网 diligentman 2周前 (10-15) 18次浏览

新建 appfiltersLoggingFilter 继承 yiibaseActionFilter

LoggingFilter 的功能: 在指定请求的 action 前后各记录一条日志

<?php

namespace appfilters;

use yiibaseActionFilter;

class LoggingFilter extends ActionFilter
{
    public function beforeAction($action)
    {
        parent::beforeAction($action);

        // To do something
        printf('This is a logging for %sbeforeAction.%s', $this->getActionId($action), PHP_EOL);

        return true;
    }

    public function afterAction($action, $result)
    {
        parent::afterAction($action, $result);

        // To do something
        printf('This is a logging for %safterAction.%s', $this->getActionId($action), PHP_EOL);

        return true;
    }
}

新建 appcontrollersSystemController

<?php

namespace appcontrollers;

use appfiltersLoggingFilter;

class SystemController extends yiiwebController
{
    public function behaviors()
    {
        parent::behaviors();

        return [
            'anchorAuth' => [
                'class'  => LoggingFilter::className(),
                'only'   => ['test', 'test-one'], // 仅对 'test'、'test-one' 生效
                'except' => ['test-one'], // 排除 'test-one'
            ],
        ];
    }

    public function actionTestOne()
    {
        printf('This is a testing for %s.%s', $this->getRoute(), PHP_EOL);
    }

    public function actionTestTwo()
    {
        printf('This is a testing for %s.%s', $this->getRoute(), PHP_EOL);
    }

    public function actionTest()
    {
        printf('This is a testing for %s.%s', $this->getRoute(), PHP_EOL);
    }
}

测试

请求 http://yii.test/index.php?r=system/test

This is a logging for testbeforeAction.
This is a testing for system/test.
This is a logging for testafterAction.

请求 http://yii.test/index.php?r=system/test-one

This is a testing for system/test-one.

请求 http://yii.test/index.php?r=system/test-two

This is a testing for system/test-two.

总结

Yii 中的 ActionFilter(过滤器)相当于 Laravel 中的 Middleware(中间件),beforeAction 相当于前置中间件,afterAction 相当于后置中间件。

原文链接


喜欢 (0)