protected function add($fieldType, $fieldName, $fieldDescription) : Field { // 为避免人肉拼接namespace, 所以写了下面一坨 $field = class_namespace(Text::class, $fieldType); lego_assert(class_exists($field), 'Undefined Field ' . $field); /** @var Field $field */ $field = new $field($fieldName, $fieldDescription, $this->data()); $this->fields[$fieldName] = $field; $this->fieldAdded($field); return $field; }
private static function internalFields() { static $fields = []; if ($fields) { return $fields; } foreach (scandir(__DIR__ . '/../../Field/Provider/') as $file) { if (!ends_with($file, '.php')) { continue; } $name = explode('.php', $file)[0]; $fields[$name] = class_namespace(Text::class, $name); } return $fields; }
/** * key 转换为 RegisterData 类 * * - field.data => \Lego\Register\Data\FieldData * - \Lego\Register\Data\FieldData => \Lego\Register\Data\FieldData * * @param $key * @return mixed|string */ private static function translateClass($key) { if (is_subclass_of($key, RegisterData::class)) { return $key; } static $cache = []; // 避免多次进行父类判定 if (isset($cache[$key])) { return $cache[$key]; } // abc.def.ghi => AbcDefGhi $classBaseName = ucfirst(camel_case(str_replace('.', '_', $key))); $class = class_namespace(RegisterData::class, $classBaseName); lego_assert(is_subclass_of($class, RegisterData::class), "Unsupported Register data {$class}(key: {$key})"); $cache[$key] = $class; return $class; }
/** * 取出参数类的命名空间 * * @dataProvider classNamespaceProvider */ public function testClassNamespace($class, $namespace, $append = null, $afterAppend = null) { $this->assertEquals($namespace, class_namespace($class)); }