zeptech/opal

生成伴随对象

1.0.2 2013-05-30 14:20 UTC

This package is not auto-updated.

Last update: 2024-09-23 11:45:00 UTC


README

生成和实例化PHP伴随对象。伴随对象基于两个输入生成,一个类定义和一个伴随对象模板。模板文档可以在php-code-templates的GitHub站点找到。

示例

给定一个伴随模板(Validator.tmpl.php)

<?php
namespace my\dyn\ns;

/**
 * Simple validator that ensures that there are no null properties.
 */
class /*# modelName */Validator {

    /**
     * Validate the given model.
     *
     * @return true of all properties are non-null, false otherwise.
     */
    public function validate(/*# modelFq */ $model) {

        #{ each properties as prop
            if ($model->get/*# prop #/() === null) {
                return false;
            }
        #}

        return true;
    }
}

和一个生成器实现

<?php
namespace my\ns;

use \zpt\gen\CompanionGenerator;

/**
 * A class generator for model validators.
 */
class ValidatorGenerator extends CompanionGenerator {

    public static $companionNs = 'my\dyn\ns';

    /**
     * @Override
     */
    public function getCompanionNamespace() {
        return self::$companionNs;
    }

    /**
     * @Override
     */
    public function getTemplatePath() {
        return __DIR__ . '/Validator.tmpl.php';
    }

    /**
     * @Override
     */
    public function getValues($className) {
        $values = array();

        $refClass = new ReflectionClass($className);
        $properties = array();
        foreach ($refClass->getMethods() as $method) {
          if (substr($method->getName(), 0, 3) === 'get') {
              $properties[] = substr($method->getName(), 3));
          }
        }

        $values['properties'] = $properties;
        return $values;
    }
}

现在可以使用以下方式生成SomeClass的伴随对象

<?php
$companionGenerator = new ValidatorGenerator($outputPath);
$companionGenerator->generate('SomeClass');

它们可以用以下方式实例化(将my\dyn\ns添加到自动加载器中)

<?php
$companionLoader = new CompanionLoader($outputPath);
$validator = $companionLoader->get(
    ValidatorGenerator::$actorNamespace,
    'SomeClass'
);

或者

<?php
class ValidatorLoader extends CompanionLoader {

    public function loadFor($class) {
        return parent::get(ValidatorGenerator::$actorNs, 'SomeClass');
    }
}

(new ValidatorLoader)->loadFor('SomeClass');