. namespace core\router\parameters; use core\exception\not_found_exception; use core\param; use core\router\schema\example; use core\router\schema\parameters\mapped_property_parameter; use core\router\schema\referenced_object; use Psr\Http\Message\ServerRequestInterface; /** * A Moodle parameter referenced in the path. * * @package core * @copyright 2023 Andrew Lyons * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ class path_course extends \core\router\schema\parameters\path_parameter implements mapped_property_parameter, referenced_object { /** * Create a new path_course parameter. * * @param string $name The name of the parameter to use for the course identifier * @param mixed ...$extra Additional arguments */ public function __construct( string $name = 'course', ...$extra, ) { $extra['name'] = $name; $extra['type'] = param::RAW; $extra['description'] = <<get_record('course', [ 'id' => $value, ]); } else if (str_starts_with($value, 'idnumber:')) { $data = $DB->get_record('course', [ 'idnumber' => substr($value, strlen('idnumber:')), ]); } else if (str_starts_with($value, 'name:')) { $data = $DB->get_record('course', [ 'shortname' => substr($value, strlen('name:')), ]); } if ($data) { return $data; } throw new not_found_exception('course', $value); } #[\Override] public function add_attributes_for_parameter_value( ServerRequestInterface $request, string $value, ): ServerRequestInterface { $course = $this->get_course_for_value($value); return $request ->withAttribute($this->name, $course) ->withAttribute("{$this->name}context", \core\context\course::instance($course->id)); } #[\Override] public function get_schema_from_type(param $type): \stdClass { $schema = parent::get_schema_from_type($type); $schema->pattern = "^("; $schema->pattern .= implode("|", [ '\d+', 'idnumber:.+', 'name:.+', ]); $schema->pattern .= ")$"; return $schema; } }