qschool/sandbox

沙箱和用户代码验证的辅助库

dev-master 2020-06-30 15:04 UTC

This package is auto-updated.

Last update: 2024-09-26 17:57:01 UTC


README

这是一个用于自动检查用户提交的PHP作业的库,支持预验证和计分。

它使用一个库来在安全环境中运行PHP代码:corveda/php-sandbox

安装

要安装,只需将依赖项添加到composer中

composer require qschool/sandbox

示例

创建一个新的包含规则的类

use QSchool\Sandbox\Rules\BaseRule;

class TaskRule extends BaseRule
{
    public function validate_code_has_a_var($code)
    {
        $this->assertTrue(strpos('$a', $code) === false, 'В вашем коде не объявлена переменная $a');
    }

    public function test_example_code($code)
    {
        $this->assertTrue(strpos('<br>', $code) === false, 'Код содержит <br> вместо PHP_EOL', 3);
    }
}

初始化验证器,并检查任务

$task = QSchool\Sandbox\TaskVerification::createByRule(new TaskRule(), $code, $maxPoints = 15);

验证代码的正确性,然后检查任务,如果需要,获取错误和得分

try {

    if ($task->validate()) {
        // Валдиация кода прошла успешно


        $verificationResult = $task->verification();
        // баллов набрано: $points = $verificationResult->points();
        // допущенные ошибки: $mistakes = $verificationResult->mistakes();
    }

} catch (QSchool\Sandbox\Validator\ValidationException $exception) {
    // Ошибка валидации
}

使用

规则方便地从 QSchool\Sandbox\Rules\BaseRule 类继承,然后在这些类中需要描述测试的方法

规则类

  • validate 为前缀的方法是用于预验证任务的方法
  • test 为前缀的方法是用于检查(评估)代码本身
  • 检查方法 assertTrue($condition, $errorMessage, $points) 检查条件 $condition,如果它为假,则抛出 ValidationException 异常,可以在参数 $errorMessage 中设置异常的文本,可以在参数 $points 中设置丢失的分数

WithSandbox 特性

  • 提供 prepareSandbox 方法来配置phpSandbox的环境
  • 为每个运行的环境添加唯一的命名空间(参见 setUp),以便能够多次运行同一代码
  • setMessages 方法 - 允许为phpSandbox的错误消息设置自定义文本,或者,您可以重写所有 $messages 属性

示例

示例使用位于 example 目录中,只需更改 examples/task.php 的内容并查看结果

cd example
php index.php