qschool / sandbox
沙箱和用户代码验证的辅助库
dev-master
2020-06-30 15:04 UTC
Requires
- corveda/php-sandbox: ^2.0
Requires (Dev)
- phpunit/phpunit: ^8.5
- symfony/var-dumper: ^5.0
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