forked from loafle/openapi-generator-original
		
	PHP server generator ze-ph (Zend Expressive + Path Handler) (#4559)
* Server generator ze-ph (Zend Expressive + Path Handler) * Command line scripts for new ze-ph generator
This commit is contained in:
		
							parent
							
								
									f0cddd21fd
								
							
						
					
					
						commit
						4001503e63
					
				
							
								
								
									
										10
									
								
								bin/windows/ze-ph-petstore.bat
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								bin/windows/ze-ph-petstore.bat
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,10 @@
 | 
			
		||||
set executable=.\modules\swagger-codegen-cli\target\swagger-codegen-cli.jar
 | 
			
		||||
 | 
			
		||||
If Not Exist %executable% (
 | 
			
		||||
  mvn clean package
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
REM set JAVA_OPTS=%JAVA_OPTS% -Xmx1024M
 | 
			
		||||
set ags=generate -i modules\swagger-codegen\src\test\resources\2_0\petstore.json -l ze-ph -o samples\client\petstore\ze-ph
 | 
			
		||||
 | 
			
		||||
java %JAVA_OPTS% -jar %executable% %ags%
 | 
			
		||||
							
								
								
									
										31
									
								
								bin/ze-ph-petstore-server.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								bin/ze-ph-petstore-server.sh
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,31 @@
 | 
			
		||||
#!/bin/sh
 | 
			
		||||
 | 
			
		||||
SCRIPT="$0"
 | 
			
		||||
 | 
			
		||||
while [ -h "$SCRIPT" ] ; do
 | 
			
		||||
  ls=`ls -ld "$SCRIPT"`
 | 
			
		||||
  link=`expr "$ls" : '.*-> \(.*\)$'`
 | 
			
		||||
  if expr "$link" : '/.*' > /dev/null; then
 | 
			
		||||
    SCRIPT="$link"
 | 
			
		||||
  else
 | 
			
		||||
    SCRIPT=`dirname "$SCRIPT"`/"$link"
 | 
			
		||||
  fi
 | 
			
		||||
done
 | 
			
		||||
 | 
			
		||||
if [ ! -d "${APP_DIR}" ]; then
 | 
			
		||||
  APP_DIR=`dirname "$SCRIPT"`/..
 | 
			
		||||
  APP_DIR=`cd "${APP_DIR}"; pwd`
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
executable="./modules/swagger-codegen-cli/target/swagger-codegen-cli.jar"
 | 
			
		||||
 | 
			
		||||
if [ ! -f "$executable" ]
 | 
			
		||||
then
 | 
			
		||||
  mvn clean package
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
# if you've executed sbt assembly previously it will use that instead.
 | 
			
		||||
export JAVA_OPTS="${JAVA_OPTS} -XX:MaxPermSize=256M -Xmx1024M -DloggerPath=conf/log4j.properties"
 | 
			
		||||
ags="$@ generate -t modules/swagger-codegen/src/main/resources/ze-ph -i modules/swagger-codegen/src/test/resources/2_0/petstore-with-fake-endpoints-models-for-testing.yaml -l ze-ph -o samples/server/petstore/ze-ph"
 | 
			
		||||
 | 
			
		||||
java $JAVA_OPTS -jar $executable $ags
 | 
			
		||||
@ -0,0 +1,216 @@
 | 
			
		||||
package io.swagger.codegen.languages;
 | 
			
		||||
 | 
			
		||||
import io.swagger.codegen.*;
 | 
			
		||||
import io.swagger.models.Operation;
 | 
			
		||||
import org.apache.commons.lang3.StringUtils;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
import java.io.File;
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.HashMap;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
 | 
			
		||||
public class ZendExpressivePathHandlerServerCodegen extends AbstractPhpCodegen {
 | 
			
		||||
    @Override
 | 
			
		||||
    public CodegenType getTag() {
 | 
			
		||||
        return CodegenType.SERVER;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public String getName() {
 | 
			
		||||
        return "ze-ph";
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public String getHelp() {
 | 
			
		||||
        return "Generates PHP server stub using Zend Expressive ( https://zendframework.github.io/zend-expressive ) and Path Handler ( https://github.com/Articus/PathHandler ).";
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public ZendExpressivePathHandlerServerCodegen() {
 | 
			
		||||
        super();
 | 
			
		||||
 | 
			
		||||
        embeddedTemplateDir = templateDir = "ze-ph";
 | 
			
		||||
        invokerPackage = "App";
 | 
			
		||||
        packagePath = "";
 | 
			
		||||
        srcBasePath = "src" + File.separator + "App";
 | 
			
		||||
        apiDirName = "Handler";
 | 
			
		||||
        modelDirName = "DTO";
 | 
			
		||||
        apiPackage = invokerPackage + "\\" + apiDirName;
 | 
			
		||||
        modelPackage = invokerPackage + "\\" + modelDirName;
 | 
			
		||||
 | 
			
		||||
        apiTestTemplateFiles.clear();
 | 
			
		||||
        modelTestTemplateFiles.clear();
 | 
			
		||||
        apiDocTemplateFiles.clear();
 | 
			
		||||
        modelDocTemplateFiles.clear();
 | 
			
		||||
 | 
			
		||||
        supportingFiles.add(new SupportingFile("README.md.mustache", packagePath, "README.md"));
 | 
			
		||||
        supportingFiles.add(new SupportingFile("composer.json.mustache", packagePath, "composer.json"));
 | 
			
		||||
        supportingFiles.add(new SupportingFile("index.php", packagePath + File.separator + "public", "index.php"));
 | 
			
		||||
        supportingFiles.add(new SupportingFile("container.php", packagePath + File.separator + "application", "container.php"));
 | 
			
		||||
        supportingFiles.add(new SupportingFile("config.yml", packagePath + File.separator + "application", "config.yml"));
 | 
			
		||||
        supportingFiles.add(new SupportingFile("app.yml.mustache", packagePath + File.separator + "application" + File.separator + "config", "app.yml"));
 | 
			
		||||
        supportingFiles.add(new SupportingFile("path_handler.yml.mustache", packagePath + File.separator + "application" + File.separator + "config", "path_handler.yml"));
 | 
			
		||||
        supportingFiles.add(new SupportingFile("data_transfer.yml.mustache", packagePath + File.separator + "application" + File.separator + "config", "data_transfer.yml"));
 | 
			
		||||
        supportingFiles.add(new SupportingFile("Date.php.mustache", packagePath + File.separator + srcBasePath + File.separator + "Strategy", "Date.php"));
 | 
			
		||||
        supportingFiles.add(new SupportingFile("DateTime.php.mustache", packagePath + File.separator + srcBasePath + File.separator + "Strategy", "DateTime.php"));
 | 
			
		||||
        supportingFiles.add(new SupportingFile("Type.php.mustache", packagePath + File.separator + srcBasePath + File.separator + "Validator", "Type.php"));
 | 
			
		||||
        supportingFiles.add(new SupportingFile("ErrorMiddleware.php.mustache", packagePath + File.separator + srcBasePath, "ErrorMiddleware.php"));
 | 
			
		||||
 | 
			
		||||
        additionalProperties.put(CodegenConstants.ARTIFACT_VERSION, "1.0.0");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Add operation to group
 | 
			
		||||
     * Override of default grouping - group by resource path, not tag
 | 
			
		||||
     *
 | 
			
		||||
     * @param tag          name of the tag
 | 
			
		||||
     * @param resourcePath path of the resource
 | 
			
		||||
     * @param operation    Swagger Operation object
 | 
			
		||||
     * @param co           Codegen Operation object
 | 
			
		||||
     * @param operations   map of Codegen operations
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public void addOperationToGroup(String tag, String resourcePath, Operation operation, CodegenOperation co, Map<String, List<CodegenOperation>> operations) {
 | 
			
		||||
        List<CodegenOperation> opList = operations.get(resourcePath);
 | 
			
		||||
        if (opList == null) {
 | 
			
		||||
            opList = new ArrayList<CodegenOperation>();
 | 
			
		||||
            operations.put(resourcePath, opList);
 | 
			
		||||
        }
 | 
			
		||||
        //ignore duplicate operation ids - that means that operation has several tags
 | 
			
		||||
        int counter = 0;
 | 
			
		||||
        for (CodegenOperation op : opList) {
 | 
			
		||||
            if (co.operationId.equals(op.operationId)) {
 | 
			
		||||
                counter++;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        if (counter == 0) {
 | 
			
		||||
            co.operationIdLowerCase = co.operationId.toLowerCase();
 | 
			
		||||
            opList.add(co);
 | 
			
		||||
            co.baseName = tag;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Return the file name of the Api Test
 | 
			
		||||
     *
 | 
			
		||||
     * @param name the file name of the Api
 | 
			
		||||
     * @return the file name of the Api
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public String toApiFilename(String name) {
 | 
			
		||||
        return toApiName(name);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Output the API (class) name (capitalized) ending with "Api"
 | 
			
		||||
     * Return DefaultApi if name is empty
 | 
			
		||||
     *
 | 
			
		||||
     * @param name the name of the Api
 | 
			
		||||
     * @return capitalized Api name ending with "Api"
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public String toApiName(String name) {
 | 
			
		||||
        //Remove }
 | 
			
		||||
        name = name.replaceAll("[\\}]", "");
 | 
			
		||||
        return super.toModelName(name);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public Map<String, Object> postProcessOperations(Map<String, Object> objs) {
 | 
			
		||||
        objs = super.postProcessOperations(objs);
 | 
			
		||||
        Map<String, Object> operations = (Map<String, Object>) objs.get("operations");
 | 
			
		||||
        List<CodegenOperation> operationList = (List<CodegenOperation>) operations.get("operation");
 | 
			
		||||
        String interfaceToImplement;
 | 
			
		||||
        StringBuilder interfacesToImplement = new StringBuilder();
 | 
			
		||||
        String classMethod;
 | 
			
		||||
        for (CodegenOperation op : operationList) {
 | 
			
		||||
            switch (op.httpMethod) {
 | 
			
		||||
                case "GET":
 | 
			
		||||
                    interfaceToImplement = "Operation\\GetInterface";
 | 
			
		||||
                    classMethod = "handleGet";
 | 
			
		||||
                    break;
 | 
			
		||||
                case "POST":
 | 
			
		||||
                    interfaceToImplement = "Operation\\PostInterface";
 | 
			
		||||
                    classMethod = "handlePost";
 | 
			
		||||
                    break;
 | 
			
		||||
                case "PATCH":
 | 
			
		||||
                    interfaceToImplement = "Operation\\PatchInterface";
 | 
			
		||||
                    classMethod = "handlePatch";
 | 
			
		||||
                    break;
 | 
			
		||||
                case "PUT":
 | 
			
		||||
                    interfaceToImplement = "Operation\\PutInterface";
 | 
			
		||||
                    classMethod = "handlePut";
 | 
			
		||||
                    break;
 | 
			
		||||
                case "DELETE":
 | 
			
		||||
                    interfaceToImplement = "Operation\\DeleteInterface";
 | 
			
		||||
                    classMethod = "handleDelete";
 | 
			
		||||
                    break;
 | 
			
		||||
                default:
 | 
			
		||||
                    throw new RuntimeException("Unknown HTTP Method " + op.httpMethod + " not allowed");
 | 
			
		||||
            }
 | 
			
		||||
            if (interfacesToImplement.length() > 0) {
 | 
			
		||||
                interfacesToImplement.append(", ");
 | 
			
		||||
            }
 | 
			
		||||
            interfacesToImplement.append(interfaceToImplement);
 | 
			
		||||
            op.httpMethod = classMethod;
 | 
			
		||||
        }
 | 
			
		||||
        operations.put("interfacesToImplement", interfacesToImplement.toString());
 | 
			
		||||
 | 
			
		||||
        return objs;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public Map<String, Object> postProcessSupportingFileData(Map<String, Object> objs) {
 | 
			
		||||
        objs = super.postProcessSupportingFileData(objs);
 | 
			
		||||
 | 
			
		||||
        Map<String, Object> apiInfo = (Map<String, Object>) objs.get("apiInfo");
 | 
			
		||||
        List<Map<String, Object>> apis = (List<Map<String, Object>>) apiInfo.get("apis");
 | 
			
		||||
 | 
			
		||||
        List<Map<String, Object>> routes = new ArrayList<Map<String, Object>>();
 | 
			
		||||
        for (Map<String, Object> api : apis) {
 | 
			
		||||
            String handler = (String) api.get("classname");
 | 
			
		||||
            String url = (String) api.get("baseName");
 | 
			
		||||
            if (url.charAt(0) == '/') {
 | 
			
		||||
                url = url.substring(1);
 | 
			
		||||
            }
 | 
			
		||||
            insertRoute(routes, url.split("/"), 0, handler);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        objs.put("routes", routes);
 | 
			
		||||
        return objs;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void insertRoute(List<Map<String, Object>> routes, String[] urlParts, int currentUrlPartIndex, String handler) {
 | 
			
		||||
        if (urlParts.length > currentUrlPartIndex) {
 | 
			
		||||
            String urlPart = urlParts[currentUrlPartIndex];
 | 
			
		||||
            //List<Map<String, Object>> subRoutes = null;
 | 
			
		||||
            Map<String, Object> currentRoute = null;
 | 
			
		||||
            for (Map<String, Object> route : routes) {
 | 
			
		||||
                if (urlPart.equals(route.get("name"))) {
 | 
			
		||||
                    currentRoute = route;
 | 
			
		||||
                    break;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            if (currentRoute == null) {
 | 
			
		||||
                currentRoute = new HashMap<String, Object>();
 | 
			
		||||
 | 
			
		||||
                String routePart = urlPart.replaceAll("^\\{(\\w+)\\}$", ":$1");
 | 
			
		||||
                boolean isLastUrlPart = currentUrlPartIndex == urlParts.length - 1;
 | 
			
		||||
 | 
			
		||||
                currentRoute.put("name", urlPart);
 | 
			
		||||
                currentRoute.put("route", "/" + routePart);
 | 
			
		||||
                currentRoute.put("type", (urlPart == routePart) ? "Literal" : "Segment");
 | 
			
		||||
                currentRoute.put("handler", isLastUrlPart ? handler : null);
 | 
			
		||||
                currentRoute.put("hasChildren", false);
 | 
			
		||||
                currentRoute.put("children", new ArrayList<Map<String, Object>>());
 | 
			
		||||
                currentRoute.put("padding", StringUtils.repeat(' ', 4 * currentUrlPartIndex));
 | 
			
		||||
 | 
			
		||||
                routes.add(currentRoute);
 | 
			
		||||
            }
 | 
			
		||||
            List<Map<String, Object>> subRoutes = (List<Map<String, Object>>) currentRoute.get("children");
 | 
			
		||||
            insertRoute(subRoutes, urlParts, currentUrlPartIndex + 1, handler);
 | 
			
		||||
            currentRoute.put("hasChildren", !subRoutes.isEmpty());
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -59,3 +59,4 @@ io.swagger.codegen.languages.GoServerCodegen
 | 
			
		||||
io.swagger.codegen.languages.ErlangServerCodegen
 | 
			
		||||
io.swagger.codegen.languages.UndertowCodegen
 | 
			
		||||
io.swagger.codegen.languages.JavaMSF4JServerCodegen
 | 
			
		||||
io.swagger.codegen.languages.ZendExpressivePathHandlerServerCodegen
 | 
			
		||||
@ -0,0 +1,17 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
namespace {{invokerPackage}}\Strategy;
 | 
			
		||||
 | 
			
		||||
class Date extends DateTime
 | 
			
		||||
{
 | 
			
		||||
    const DATE_TIME_FORMAT = 'Y-m-d';
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @param $arrayValue
 | 
			
		||||
     * @return \DateTime
 | 
			
		||||
     */
 | 
			
		||||
    protected function parseDateString($arrayValue)
 | 
			
		||||
    {
 | 
			
		||||
        return \DateTime::createFromFormat(static::DATE_TIME_FORMAT.' H:i:sP', $arrayValue.' 00:00:00+00:00', new \DateTimeZone('UTC'));
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -0,0 +1,44 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
namespace {{invokerPackage}}\Strategy;
 | 
			
		||||
use Articus\DataTransfer\Strategy\StrategyInterface;
 | 
			
		||||
 | 
			
		||||
class DateTime implements StrategyInterface
 | 
			
		||||
{
 | 
			
		||||
    const DATE_TIME_FORMAT = \DateTime::RFC3339;
 | 
			
		||||
    /**
 | 
			
		||||
     * @inheritDoc
 | 
			
		||||
     */
 | 
			
		||||
    public function extract($objectValue, $object = null)
 | 
			
		||||
    {
 | 
			
		||||
        $result = null;
 | 
			
		||||
        if ($objectValue instanceof \DateTime) {
 | 
			
		||||
            $result = $objectValue->format(static::DATE_TIME_FORMAT);
 | 
			
		||||
        }
 | 
			
		||||
        return $result;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @inheritDoc
 | 
			
		||||
     */
 | 
			
		||||
    public function hydrate($arrayValue, $objectValue, array $array = null)
 | 
			
		||||
    {
 | 
			
		||||
        $result = null;
 | 
			
		||||
        if (!empty($arrayValue)) {
 | 
			
		||||
            $date = $this->parseDateString($arrayValue);
 | 
			
		||||
            if ($date instanceof \DateTime) {
 | 
			
		||||
                $result = $date;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return $result;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @param $arrayValue
 | 
			
		||||
     * @return \DateTime
 | 
			
		||||
     */
 | 
			
		||||
    protected function parseDateString($arrayValue)
 | 
			
		||||
    {
 | 
			
		||||
        return \DateTime::createFromFormat(static::DATE_TIME_FORMAT, $arrayValue, new \DateTimeZone('UTC'));
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -0,0 +1,20 @@
 | 
			
		||||
<?php
 | 
			
		||||
namespace {{invokerPackage}};
 | 
			
		||||
 | 
			
		||||
use Psr\Http\Message\ResponseInterface as Response;
 | 
			
		||||
use Psr\Http\Message\ServerRequestInterface as Request;
 | 
			
		||||
use Zend\Stratigility\ErrorMiddlewareInterface;
 | 
			
		||||
 | 
			
		||||
class ErrorMiddleware implements ErrorMiddlewareInterface
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * @inheritDoc
 | 
			
		||||
     */
 | 
			
		||||
    public function __invoke($error, Request $request, Response $response, callable $out = null)
 | 
			
		||||
    {
 | 
			
		||||
        $response = $response->withStatus(500, 'Internal server error');
 | 
			
		||||
        $response->getBody()->write((string)$error);
 | 
			
		||||
        error_log((string) $error);
 | 
			
		||||
        return ($out === null)? $response : $out($request, $response);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -0,0 +1,10 @@
 | 
			
		||||
# Swagger generated server
 | 
			
		||||
 | 
			
		||||
## Overview
 | 
			
		||||
This server was generated by the [swagger-codegen](https://github.com/swagger-api/swagger-codegen) project. By using the
 | 
			
		||||
[OpenAPI-Spec](https://github.com/swagger-api/swagger-core/wiki) from a remote server, you can easily generate a server stub. This
 | 
			
		||||
is an example of building a PHP server.
 | 
			
		||||
 | 
			
		||||
This example uses the [Zend Expressive](https://zendframework.github.io/zend-expressive) micro framework and [Path Handler](https://github.com/Articus/PathHandler) library. To see how to make this your own, please take a look at the template here:
 | 
			
		||||
 | 
			
		||||
[TEMPLATES](https://github.com/swagger-api/swagger-codegen/tree/master/modules/swagger-codegen/src/main/resources/ze-ph/)
 | 
			
		||||
@ -0,0 +1,71 @@
 | 
			
		||||
<?php
 | 
			
		||||
namespace {{invokerPackage}}\Validator;
 | 
			
		||||
 | 
			
		||||
use Zend\Validator\AbstractValidator;
 | 
			
		||||
use Zend\Validator\Exception;
 | 
			
		||||
 | 
			
		||||
class Type extends AbstractValidator
 | 
			
		||||
{
 | 
			
		||||
    const INVALID = 'typeInvalid';
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Validation failure message template definitions
 | 
			
		||||
     *
 | 
			
		||||
     * @var array
 | 
			
		||||
     */
 | 
			
		||||
    protected $messageTemplates = [
 | 
			
		||||
        self::INVALID => 'Invalid type given.',
 | 
			
		||||
    ];
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @var string
 | 
			
		||||
     */
 | 
			
		||||
    protected $type;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @return mixed
 | 
			
		||||
     */
 | 
			
		||||
    public function getType()
 | 
			
		||||
    {
 | 
			
		||||
        return $this->type;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @param string $type
 | 
			
		||||
     * @return self
 | 
			
		||||
     */
 | 
			
		||||
    public function setType($type)
 | 
			
		||||
    {
 | 
			
		||||
        $this->type = $type;
 | 
			
		||||
        return $this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @inheritDoc
 | 
			
		||||
     */
 | 
			
		||||
    public function isValid($value)
 | 
			
		||||
    {
 | 
			
		||||
        $result = true;
 | 
			
		||||
        if (!$this->checkType($value)) {
 | 
			
		||||
            $this->error(self::INVALID);
 | 
			
		||||
            $result = false;
 | 
			
		||||
        }
 | 
			
		||||
        return $result;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    protected function checkType($value)
 | 
			
		||||
    {
 | 
			
		||||
        switch ($this->type) {
 | 
			
		||||
            case 'int':
 | 
			
		||||
                return is_int($value);
 | 
			
		||||
            case 'bool':
 | 
			
		||||
                return is_bool($value);
 | 
			
		||||
            case 'float':
 | 
			
		||||
                return is_float($value) || is_int($value);
 | 
			
		||||
            case 'string':
 | 
			
		||||
                return is_string($value);
 | 
			
		||||
            default:
 | 
			
		||||
                throw new \InvalidArgumentException(sprintf('Can not check for type %s.', $this->type));
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -0,0 +1,60 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
namespace {{package}};
 | 
			
		||||
 | 
			
		||||
use Articus\PathHandler\Operation;
 | 
			
		||||
use Articus\PathHandler\Annotation as PHA;
 | 
			
		||||
use Articus\PathHandler\Consumer as PHConsumer;
 | 
			
		||||
use Articus\PathHandler\Producer as PHProducer;
 | 
			
		||||
use Articus\PathHandler\Attribute as PHAttribute;
 | 
			
		||||
use Articus\PathHandler\Exception as PHException;
 | 
			
		||||
use Psr\Http\Message\ServerRequestInterface;
 | 
			
		||||
 | 
			
		||||
{{#operations}}
 | 
			
		||||
 | 
			
		||||
{{#description}}
 | 
			
		||||
/**
 | 
			
		||||
 * {{&description}}
 | 
			
		||||
 */
 | 
			
		||||
{{/description}}
 | 
			
		||||
class {{classname}} implements {{interfacesToImplement}}
 | 
			
		||||
{
 | 
			
		||||
{{#operation}}
 | 
			
		||||
    /**
 | 
			
		||||
{{#summary}}
 | 
			
		||||
     * {{summary}}
 | 
			
		||||
{{/summary}}
 | 
			
		||||
{{#description}}
 | 
			
		||||
     * {{description}}
 | 
			
		||||
{{/description}}
 | 
			
		||||
{{#bodyParam}}
 | 
			
		||||
{{#consumes}}
 | 
			
		||||
     * TODO check if consumer is valid, if it has correct priority and if it can be moved to class annotation
 | 
			
		||||
     * @PHA\Consumer(name=PHConsumer\Json::class, mediaType="{{mediaType}}")
 | 
			
		||||
{{/consumes}}
 | 
			
		||||
{{^isPrimitiveType}}
 | 
			
		||||
     * @PHA\Attribute(name=PHAttribute\Transfer::class, options={"type":{{dataType}}::class,"objectAttr":"{{paramName}}"})
 | 
			
		||||
{{/isPrimitiveType}}
 | 
			
		||||
{{/bodyParam}}
 | 
			
		||||
{{#produces}}
 | 
			
		||||
     * TODO check if producer is valid, if it has correct priority and if it can be moved to class annotation
 | 
			
		||||
     * @PHA\Producer(name=PHProducer\Transfer::class, mediaType="{{mediaType}}")
 | 
			
		||||
{{/produces}}
 | 
			
		||||
{{#returnType}}
 | 
			
		||||
     * @return {{returnType}}
 | 
			
		||||
{{/returnType}}
 | 
			
		||||
     */
 | 
			
		||||
    public function {{httpMethod}}(ServerRequestInterface $request)
 | 
			
		||||
    {
 | 
			
		||||
        //TODO implement method
 | 
			
		||||
{{#bodyParam}}
 | 
			
		||||
{{^isPrimitiveType}}
 | 
			
		||||
        /** @var {{dataType}} ${{paramName}} */
 | 
			
		||||
        ${{paramName}} = $request->getAttribute("{{paramName}}");
 | 
			
		||||
{{/isPrimitiveType}}
 | 
			
		||||
{{/bodyParam}}
 | 
			
		||||
        throw new PHException\HttpCode(500, "Not implemented");
 | 
			
		||||
    }
 | 
			
		||||
{{/operation}}
 | 
			
		||||
}
 | 
			
		||||
{{/operations}}
 | 
			
		||||
@ -0,0 +1,19 @@
 | 
			
		||||
dependencies:
 | 
			
		||||
  invokables:
 | 
			
		||||
    #Has to add this line because currently router is strict requirement for Zend\Expressive\Application even if only middleware_pipeline is used
 | 
			
		||||
    Zend\Expressive\Router\RouterInterface: Zend\Expressive\Router\ZendRouter
 | 
			
		||||
    Zend\Diactoros\Response\EmitterInterface: Zend\Diactoros\Response\SapiStreamEmitter
 | 
			
		||||
    {{invokerPackage}}\ErrorMiddleware: {{invokerPackage}}\ErrorMiddleware
 | 
			
		||||
  factories:
 | 
			
		||||
    Zend\Expressive\Application: Zend\Expressive\Container\ApplicationFactory
 | 
			
		||||
    Articus\PathHandler\Middleware: Articus\PathHandler\MiddlewareFactory
 | 
			
		||||
    Articus\DataTransfer\Service: Articus\DataTransfer\ServiceFactory
 | 
			
		||||
 | 
			
		||||
middleware_pipeline:
 | 
			
		||||
  api:
 | 
			
		||||
    middleware: Articus\PathHandler\Middleware
 | 
			
		||||
    path: {{basePathWithoutHost}}
 | 
			
		||||
  error:
 | 
			
		||||
    middleware: {{invokerPackage}}\ErrorMiddleware
 | 
			
		||||
    error: true
 | 
			
		||||
    priority: -10000
 | 
			
		||||
@ -0,0 +1,22 @@
 | 
			
		||||
{
 | 
			
		||||
    "name": "{{gitUserId}}/{{gitRepoId}}",
 | 
			
		||||
    "description": "{{description}}",
 | 
			
		||||
    "license": "proprietary",
 | 
			
		||||
    "version": "{{artifactVersion}}",
 | 
			
		||||
    "type": "project",
 | 
			
		||||
    "require": {
 | 
			
		||||
        "php": "^5.6 || ^7.0",
 | 
			
		||||
        "ext-yaml" : "^1.2 || ^2.0",
 | 
			
		||||
        "zendframework/zend-expressive": "^1.0",
 | 
			
		||||
        "zendframework/zend-expressive-router": "1.2.*",
 | 
			
		||||
        "articus/path-handler": "0.1.*",
 | 
			
		||||
        "articus/data-transfer": "*",
 | 
			
		||||
        "zendframework/zend-serializer": "*",
 | 
			
		||||
        "zendframework/zend-config": "*"
 | 
			
		||||
    },
 | 
			
		||||
    "autoload": {
 | 
			
		||||
        "psr-4": {
 | 
			
		||||
            "": "src/"
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -0,0 +1,2 @@
 | 
			
		||||
#App
 | 
			
		||||
cache_configuration: false
 | 
			
		||||
@ -0,0 +1,46 @@
 | 
			
		||||
<?php
 | 
			
		||||
use Zend\Config\Factory as ConfigFactory;
 | 
			
		||||
 | 
			
		||||
//Use Composer autoload that includes code both from ../src and ../vendor
 | 
			
		||||
require __DIR__ . '/../vendor/autoload.php';
 | 
			
		||||
 | 
			
		||||
//Path to file for caching full configuration
 | 
			
		||||
const CONFIG_CACHE_PATH = __DIR__ . '/../data/cache/config.php';
 | 
			
		||||
 | 
			
		||||
//Get full configuration
 | 
			
		||||
$config = [];
 | 
			
		||||
if (is_readable(CONFIG_CACHE_PATH)) {
 | 
			
		||||
    $config = include CONFIG_CACHE_PATH;
 | 
			
		||||
} else {
 | 
			
		||||
    //Register extra extension for YAML files
 | 
			
		||||
    ConfigFactory::registerReader('yml', 'yaml');
 | 
			
		||||
 | 
			
		||||
    //Combine all configuration files in right order
 | 
			
		||||
    $config = ConfigFactory::fromFiles([
 | 
			
		||||
        __DIR__ . '/config/data_transfer.yml',
 | 
			
		||||
        __DIR__ . '/config/path_handler.yml',
 | 
			
		||||
        __DIR__ . '/config/app.yml',
 | 
			
		||||
        __DIR__ . '/config.yml',
 | 
			
		||||
    ]);
 | 
			
		||||
 | 
			
		||||
    //Cache full configuration
 | 
			
		||||
    if (isset($config['cache_configuration']) && $config['cache_configuration']) {
 | 
			
		||||
        if (!ConfigFactory::toFile(CONFIG_CACHE_PATH, $config)) {
 | 
			
		||||
            throw new \RuntimeException('Failed to cache configuration');
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
//Get configuration for container
 | 
			
		||||
$dependencies = [];
 | 
			
		||||
if (isset($config['dependencies'])) {
 | 
			
		||||
    $dependencies = $config['dependencies'];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//Create container
 | 
			
		||||
$container = new \Zend\ServiceManager\ServiceManager($dependencies);
 | 
			
		||||
 | 
			
		||||
//Register full configuration as a service
 | 
			
		||||
$container->setService('config', $config);
 | 
			
		||||
$container->setAlias('Config', 'config');
 | 
			
		||||
 | 
			
		||||
return $container;
 | 
			
		||||
@ -0,0 +1,28 @@
 | 
			
		||||
data_transfer:
 | 
			
		||||
  metadata_cache:
 | 
			
		||||
    adapter:
 | 
			
		||||
      name: blackhole
 | 
			
		||||
#    adapter:
 | 
			
		||||
#      name: filesystem
 | 
			
		||||
#      options:
 | 
			
		||||
#        cache_dir: data/cache/data_transfer
 | 
			
		||||
#        namespace: dt
 | 
			
		||||
 | 
			
		||||
  strategies:
 | 
			
		||||
    invokables:
 | 
			
		||||
      {{invokerPackage}}\Strategy\Date: {{invokerPackage}}\Strategy\Date
 | 
			
		||||
      {{invokerPackage}}\Strategy\DateTime: {{invokerPackage}}\Strategy\DateTime
 | 
			
		||||
#    factories:
 | 
			
		||||
    aliases:
 | 
			
		||||
      Date: {{invokerPackage}}\Strategy\Date
 | 
			
		||||
      DateTime: {{invokerPackage}}\Strategy\DateTime
 | 
			
		||||
  validators:
 | 
			
		||||
    invokables:
 | 
			
		||||
      {{invokerPackage}}\Validator\Type: {{invokerPackage}}\Validator\Type
 | 
			
		||||
    factories:
 | 
			
		||||
      Articus\DataTransfer\Validator\Dictionary: Articus\DataTransfer\Validator\Factory
 | 
			
		||||
      Articus\DataTransfer\Validator\Collection: Articus\DataTransfer\Validator\Factory
 | 
			
		||||
    aliases:
 | 
			
		||||
      Dictionary: Articus\DataTransfer\Validator\Dictionary
 | 
			
		||||
      Collection: Articus\DataTransfer\Validator\Collection
 | 
			
		||||
      Type: {{invokerPackage}}\Validator\Type
 | 
			
		||||
							
								
								
									
										10
									
								
								modules/swagger-codegen/src/main/resources/ze-ph/index.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								modules/swagger-codegen/src/main/resources/ze-ph/index.php
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,10 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
chdir(dirname(__DIR__));
 | 
			
		||||
 | 
			
		||||
/** @var \Zend\ServiceManager\ServiceManager $container */
 | 
			
		||||
$container = require_once __DIR__.'/../application/container.php';
 | 
			
		||||
 | 
			
		||||
/** @var \Zend\Expressive\Application $app */
 | 
			
		||||
$app = $container->get(\Zend\Expressive\Application::class);
 | 
			
		||||
$app->run();
 | 
			
		||||
							
								
								
									
										131
									
								
								modules/swagger-codegen/src/main/resources/ze-ph/model.mustache
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										131
									
								
								modules/swagger-codegen/src/main/resources/ze-ph/model.mustache
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,131 @@
 | 
			
		||||
<?php
 | 
			
		||||
{{#models}}{{#model}}
 | 
			
		||||
namespace {{package}};
 | 
			
		||||
 | 
			
		||||
use Articus\DataTransfer\Annotation as DTA;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
{{#description}}
 | 
			
		||||
 * {{description}}
 | 
			
		||||
{{/description}}
 | 
			
		||||
 */
 | 
			
		||||
class {{classname}} 
 | 
			
		||||
{
 | 
			
		||||
{{#vars}}
 | 
			
		||||
    /**
 | 
			
		||||
{{#description}}
 | 
			
		||||
     * {{description}}
 | 
			
		||||
{{/description}}
 | 
			
		||||
     * @DTA\Data(field="{{baseName}}"{{^required}}, nullable=true{{/required}})
 | 
			
		||||
{{^isPrimitiveType}}
 | 
			
		||||
{{^isListContainer}}
 | 
			
		||||
{{^isDate}}
 | 
			
		||||
{{^isDateTime}}
 | 
			
		||||
     * @DTA\Strategy(name="Object", options={"type":{{datatype}}::class})
 | 
			
		||||
     * @DTA\Validator(name="Dictionary", options={"type":{{datatype}}::class})
 | 
			
		||||
{{/isDateTime}}
 | 
			
		||||
{{/isDate}}
 | 
			
		||||
{{#isDate}}
 | 
			
		||||
     * @DTA\Strategy(name="Date")
 | 
			
		||||
     * @DTA\Validator(name="Date")
 | 
			
		||||
{{/isDate}}
 | 
			
		||||
{{#isDateTime}}
 | 
			
		||||
     * @DTA\Strategy(name="DateTime")
 | 
			
		||||
     * @DTA\Validator(name="Date", options={"format": \DateTime::RFC3339})
 | 
			
		||||
{{/isDateTime}}
 | 
			
		||||
{{/isListContainer}}
 | 
			
		||||
{{#isListContainer}}
 | 
			
		||||
     * @DTA\Strategy(name="ObjectArray", options={"type":{{#items}}{{datatype}}{{/items}}::class})
 | 
			
		||||
     * @DTA\Validator(name="Collection", options={"validators":{
 | 
			
		||||
     *     {"name":"Dictionary", "options":{"type":{{#items}}{{datatype}}{{/items}}::class}}
 | 
			
		||||
     * }})
 | 
			
		||||
{{/isListContainer}}
 | 
			
		||||
{{/isPrimitiveType}}
 | 
			
		||||
{{#isPrimitiveType}}
 | 
			
		||||
{{#isListContainer}}
 | 
			
		||||
{{#items}}
 | 
			
		||||
{{#isString}}
 | 
			
		||||
     * @DTA\Validator(name="Collection", options={"validators":{
 | 
			
		||||
     *     {"name":"Type", "options":{"type":"string"}}
 | 
			
		||||
     * }})
 | 
			
		||||
{{/isString}}
 | 
			
		||||
{{#isInteger}}
 | 
			
		||||
     * @DTA\Validator(name="Collection", options={"validators":{
 | 
			
		||||
     *     {"name":"Type", "options":{"type":"int"}}
 | 
			
		||||
     * }})
 | 
			
		||||
{{/isInteger}}
 | 
			
		||||
{{#isLong}}
 | 
			
		||||
     * @DTA\Validator(name="Collection", options={"validators":{
 | 
			
		||||
     *     {"name":"Type", "options":{"type":"int"}}
 | 
			
		||||
     * }})
 | 
			
		||||
{{/isLong}}
 | 
			
		||||
{{#isBoolean}}
 | 
			
		||||
     * @DTA\Validator(name="Collection", options={"validators":{
 | 
			
		||||
     *     {"name":"Type", "options":{"type":"bool"}}
 | 
			
		||||
     * }})
 | 
			
		||||
{{/isBoolean}}
 | 
			
		||||
{{#isFloat}}
 | 
			
		||||
     * @DTA\Validator(name="Collection", options={"validators":{
 | 
			
		||||
     *     {"name":"Type", "options":{"type":"float"}}
 | 
			
		||||
     * }})
 | 
			
		||||
{{/isFloat}}
 | 
			
		||||
{{#isDouble}}
 | 
			
		||||
     * @DTA\Validator(name="Collection", options={"validators":{
 | 
			
		||||
     *     {"name":"Type", "options":{"type":"float"}}
 | 
			
		||||
     * }})
 | 
			
		||||
{{/isDouble}}
 | 
			
		||||
{{/items}}
 | 
			
		||||
{{/isListContainer}}
 | 
			
		||||
{{^isListContainer}}
 | 
			
		||||
{{#isString}}
 | 
			
		||||
     * @DTA\Validator(name="Type", options={"type":"string"})
 | 
			
		||||
{{/isString}}
 | 
			
		||||
{{#isInteger}}
 | 
			
		||||
     * @DTA\Validator(name="Type", options={"type":"int"})
 | 
			
		||||
{{/isInteger}}
 | 
			
		||||
{{#isLong}}
 | 
			
		||||
     * @DTA\Validator(name="Type", options={"type":"int"})
 | 
			
		||||
{{/isLong}}
 | 
			
		||||
{{#isBoolean}}
 | 
			
		||||
     * @DTA\Validator(name="Type", options={"type":"bool"})
 | 
			
		||||
{{/isBoolean}}
 | 
			
		||||
{{#isFloat}}
 | 
			
		||||
     * @DTA\Validator(name="Type", options={"type":"float"})
 | 
			
		||||
{{/isFloat}}
 | 
			
		||||
{{#isDouble}}
 | 
			
		||||
     * @DTA\Validator(name="Type", options={"type":"float"})
 | 
			
		||||
{{/isDouble}}
 | 
			
		||||
{{/isListContainer}}
 | 
			
		||||
{{/isPrimitiveType}}
 | 
			
		||||
{{#hasValidation}}
 | 
			
		||||
{{#minLength}}
 | 
			
		||||
{{#maxLength}}
 | 
			
		||||
     * @DTA\Validator(name="StringLength", options={"min":{{minLength}}, "max":{{maxLength}}})
 | 
			
		||||
{{/maxLength}}
 | 
			
		||||
{{/minLength}}
 | 
			
		||||
{{^minLength}}
 | 
			
		||||
{{#maxLength}}
 | 
			
		||||
     * @DTA\Validator(name="StringLength", options={"max":{{maxLength}}})
 | 
			
		||||
{{/maxLength}}
 | 
			
		||||
{{/minLength}}
 | 
			
		||||
{{#minLength}}
 | 
			
		||||
{{^maxLength}}
 | 
			
		||||
     * @DTA\Validator(name="StringLength", options={"min":{{minLength}}})
 | 
			
		||||
{{/maxLength}}
 | 
			
		||||
{{/minLength}}
 | 
			
		||||
{{#minimum}}
 | 
			
		||||
     * @DTA\Validator(name="GreaterThan", options={"min":{{minimum}}{{^exclusiveMinimum}}, "inclusive":true{{/exclusiveMinimum}}})
 | 
			
		||||
{{/minimum}}
 | 
			
		||||
{{#maximum}}
 | 
			
		||||
     * @DTA\Validator(name="LessThan", options={"max":{{maximum}}{{^exclusiveMaximum}}, "inclusive":true{{/exclusiveMaximum}}})
 | 
			
		||||
{{/maximum}}
 | 
			
		||||
{{#pattern}}
 | 
			
		||||
     * @DTA\Validator(name="Regex", options={"pattern":"{{pattern}}})
 | 
			
		||||
{{/pattern}}
 | 
			
		||||
{{/hasValidation}}
 | 
			
		||||
     * @var {{datatype}}
 | 
			
		||||
     */
 | 
			
		||||
    public ${{name}};
 | 
			
		||||
{{/vars}}
 | 
			
		||||
}
 | 
			
		||||
{{/model}}{{/models}}
 | 
			
		||||
@ -0,0 +1,27 @@
 | 
			
		||||
path_handler:
 | 
			
		||||
  routes:
 | 
			
		||||
    routes:
 | 
			
		||||
{{#routes}}{{>route}}{{/routes}}
 | 
			
		||||
    default_params:
 | 
			
		||||
      middleware: ''
 | 
			
		||||
  metadata_cache:
 | 
			
		||||
    adapter:
 | 
			
		||||
      name: blackhole
 | 
			
		||||
#    adapter:
 | 
			
		||||
#      name: filesystem
 | 
			
		||||
#      options:
 | 
			
		||||
#        cache_dir: data/cache/path_handler
 | 
			
		||||
#        namespace: ph
 | 
			
		||||
 | 
			
		||||
  handlers:
 | 
			
		||||
    invokables:
 | 
			
		||||
{{#apiInfo}}
 | 
			
		||||
{{#apis}}
 | 
			
		||||
{{#operations}}
 | 
			
		||||
      {{classname}}: {{package}}\{{classname}}
 | 
			
		||||
{{/operations}}
 | 
			
		||||
{{/apis}}
 | 
			
		||||
{{/apiInfo}}
 | 
			
		||||
#  consumers:
 | 
			
		||||
#  attributes:
 | 
			
		||||
#  producers:
 | 
			
		||||
@ -0,0 +1,15 @@
 | 
			
		||||
      {{padding}}'{{name}}':
 | 
			
		||||
      {{padding}}  type: {{type}}
 | 
			
		||||
      {{padding}}  options:
 | 
			
		||||
      {{padding}}    route: {{route}}
 | 
			
		||||
{{#handler}}
 | 
			
		||||
      {{padding}}    defaults:
 | 
			
		||||
      {{padding}}      handler: {{handler}}
 | 
			
		||||
{{/handler}}
 | 
			
		||||
{{#hasChildren}}
 | 
			
		||||
{{#handler}}
 | 
			
		||||
      {{padding}}  may_terminate: true
 | 
			
		||||
{{/handler}}
 | 
			
		||||
      {{padding}}  child_routes:
 | 
			
		||||
{{/hasChildren}}
 | 
			
		||||
{{#children}}{{>route}}{{/children}}
 | 
			
		||||
							
								
								
									
										23
									
								
								samples/server/petstore/ze-ph/.swagger-codegen-ignore
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								samples/server/petstore/ze-ph/.swagger-codegen-ignore
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,23 @@
 | 
			
		||||
# Swagger Codegen Ignore
 | 
			
		||||
# Generated by swagger-codegen https://github.com/swagger-api/swagger-codegen
 | 
			
		||||
 | 
			
		||||
# Use this file to prevent files from being overwritten by the generator.
 | 
			
		||||
# The patterns follow closely to .gitignore or .dockerignore.
 | 
			
		||||
 | 
			
		||||
# As an example, the C# client generator defines ApiClient.cs.
 | 
			
		||||
# You can make changes and tell Swagger Codgen to ignore just this file by uncommenting the following line:
 | 
			
		||||
#ApiClient.cs
 | 
			
		||||
 | 
			
		||||
# You can match any string of characters against a directory, file or extension with a single asterisk (*):
 | 
			
		||||
#foo/*/qux
 | 
			
		||||
# The above matches foo/bar/qux and foo/baz/qux, but not foo/bar/baz/qux
 | 
			
		||||
 | 
			
		||||
# You can recursively match patterns against a directory, file or extension with a double asterisk (**):
 | 
			
		||||
#foo/**/qux
 | 
			
		||||
# This matches foo/bar/qux, foo/baz/qux, and foo/bar/baz/qux
 | 
			
		||||
 | 
			
		||||
# You can also negate patterns with an exclamation (!).
 | 
			
		||||
# For example, you can ignore all files in a docs folder with the file extension .md:
 | 
			
		||||
#docs/*.md
 | 
			
		||||
# Then explicitly reverse the ignore rule for a single file:
 | 
			
		||||
#!docs/README.md
 | 
			
		||||
							
								
								
									
										10
									
								
								samples/server/petstore/ze-ph/README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								samples/server/petstore/ze-ph/README.md
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,10 @@
 | 
			
		||||
# Swagger generated server
 | 
			
		||||
 | 
			
		||||
## Overview
 | 
			
		||||
This server was generated by the [swagger-codegen](https://github.com/swagger-api/swagger-codegen) project. By using the
 | 
			
		||||
[OpenAPI-Spec](https://github.com/swagger-api/swagger-core/wiki) from a remote server, you can easily generate a server stub. This
 | 
			
		||||
is an example of building a PHP server.
 | 
			
		||||
 | 
			
		||||
This example uses the [Zend Expressive](https://zendframework.github.io/zend-expressive) micro framework and [Path Handler](https://github.com/Articus/PathHandler) library. To see how to make this your own, please take a look at the template here:
 | 
			
		||||
 | 
			
		||||
[TEMPLATES](https://github.com/swagger-api/swagger-codegen/tree/master/modules/swagger-codegen/src/main/resources/ze-ph/)
 | 
			
		||||
							
								
								
									
										2
									
								
								samples/server/petstore/ze-ph/application/config.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								samples/server/petstore/ze-ph/application/config.yml
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,2 @@
 | 
			
		||||
#App
 | 
			
		||||
cache_configuration: false
 | 
			
		||||
							
								
								
									
										19
									
								
								samples/server/petstore/ze-ph/application/config/app.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								samples/server/petstore/ze-ph/application/config/app.yml
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,19 @@
 | 
			
		||||
dependencies:
 | 
			
		||||
  invokables:
 | 
			
		||||
    #Has to add this line because currently router is strict requirement for Zend\Expressive\Application even if only middleware_pipeline is used
 | 
			
		||||
    Zend\Expressive\Router\RouterInterface: Zend\Expressive\Router\ZendRouter
 | 
			
		||||
    Zend\Diactoros\Response\EmitterInterface: Zend\Diactoros\Response\SapiStreamEmitter
 | 
			
		||||
    App\ErrorMiddleware: App\ErrorMiddleware
 | 
			
		||||
  factories:
 | 
			
		||||
    Zend\Expressive\Application: Zend\Expressive\Container\ApplicationFactory
 | 
			
		||||
    Articus\PathHandler\Middleware: Articus\PathHandler\MiddlewareFactory
 | 
			
		||||
    Articus\DataTransfer\Service: Articus\DataTransfer\ServiceFactory
 | 
			
		||||
 | 
			
		||||
middleware_pipeline:
 | 
			
		||||
  api:
 | 
			
		||||
    middleware: Articus\PathHandler\Middleware
 | 
			
		||||
    path: /v2
 | 
			
		||||
  error:
 | 
			
		||||
    middleware: App\ErrorMiddleware
 | 
			
		||||
    error: true
 | 
			
		||||
    priority: -10000
 | 
			
		||||
@ -0,0 +1,28 @@
 | 
			
		||||
data_transfer:
 | 
			
		||||
  metadata_cache:
 | 
			
		||||
    adapter:
 | 
			
		||||
      name: blackhole
 | 
			
		||||
#    adapter:
 | 
			
		||||
#      name: filesystem
 | 
			
		||||
#      options:
 | 
			
		||||
#        cache_dir: data/cache/data_transfer
 | 
			
		||||
#        namespace: dt
 | 
			
		||||
 | 
			
		||||
  strategies:
 | 
			
		||||
    invokables:
 | 
			
		||||
      App\Strategy\Date: App\Strategy\Date
 | 
			
		||||
      App\Strategy\DateTime: App\Strategy\DateTime
 | 
			
		||||
#    factories:
 | 
			
		||||
    aliases:
 | 
			
		||||
      Date: App\Strategy\Date
 | 
			
		||||
      DateTime: App\Strategy\DateTime
 | 
			
		||||
  validators:
 | 
			
		||||
    invokables:
 | 
			
		||||
      App\Validator\Type: App\Validator\Type
 | 
			
		||||
    factories:
 | 
			
		||||
      Articus\DataTransfer\Validator\Dictionary: Articus\DataTransfer\Validator\Factory
 | 
			
		||||
      Articus\DataTransfer\Validator\Collection: Articus\DataTransfer\Validator\Factory
 | 
			
		||||
    aliases:
 | 
			
		||||
      Dictionary: Articus\DataTransfer\Validator\Dictionary
 | 
			
		||||
      Collection: Articus\DataTransfer\Validator\Collection
 | 
			
		||||
      Type: App\Validator\Type
 | 
			
		||||
@ -0,0 +1,131 @@
 | 
			
		||||
path_handler:
 | 
			
		||||
  routes:
 | 
			
		||||
    routes:
 | 
			
		||||
      'pet':
 | 
			
		||||
        type: Literal
 | 
			
		||||
        options:
 | 
			
		||||
          route: /pet
 | 
			
		||||
          defaults:
 | 
			
		||||
            handler: Pet
 | 
			
		||||
        may_terminate: true
 | 
			
		||||
        child_routes:
 | 
			
		||||
          'findByStatus':
 | 
			
		||||
            type: Literal
 | 
			
		||||
            options:
 | 
			
		||||
              route: /findByStatus
 | 
			
		||||
              defaults:
 | 
			
		||||
                handler: PetFindByStatus
 | 
			
		||||
          'findByTags':
 | 
			
		||||
            type: Literal
 | 
			
		||||
            options:
 | 
			
		||||
              route: /findByTags
 | 
			
		||||
              defaults:
 | 
			
		||||
                handler: PetFindByTags
 | 
			
		||||
          '{petId}':
 | 
			
		||||
            type: Segment
 | 
			
		||||
            options:
 | 
			
		||||
              route: /:petId
 | 
			
		||||
              defaults:
 | 
			
		||||
                handler: PetPetId
 | 
			
		||||
            may_terminate: true
 | 
			
		||||
            child_routes:
 | 
			
		||||
              'uploadImage':
 | 
			
		||||
                type: Literal
 | 
			
		||||
                options:
 | 
			
		||||
                  route: /uploadImage
 | 
			
		||||
                  defaults:
 | 
			
		||||
                    handler: PetPetIdUploadImage
 | 
			
		||||
      'store':
 | 
			
		||||
        type: Literal
 | 
			
		||||
        options:
 | 
			
		||||
          route: /store
 | 
			
		||||
        child_routes:
 | 
			
		||||
          'inventory':
 | 
			
		||||
            type: Literal
 | 
			
		||||
            options:
 | 
			
		||||
              route: /inventory
 | 
			
		||||
              defaults:
 | 
			
		||||
                handler: StoreInventory
 | 
			
		||||
          'order':
 | 
			
		||||
            type: Literal
 | 
			
		||||
            options:
 | 
			
		||||
              route: /order
 | 
			
		||||
              defaults:
 | 
			
		||||
                handler: StoreOrder
 | 
			
		||||
            may_terminate: true
 | 
			
		||||
            child_routes:
 | 
			
		||||
              '{orderId}':
 | 
			
		||||
                type: Segment
 | 
			
		||||
                options:
 | 
			
		||||
                  route: /:orderId
 | 
			
		||||
                  defaults:
 | 
			
		||||
                    handler: StoreOrderOrderId
 | 
			
		||||
      'user':
 | 
			
		||||
        type: Literal
 | 
			
		||||
        options:
 | 
			
		||||
          route: /user
 | 
			
		||||
          defaults:
 | 
			
		||||
            handler: User
 | 
			
		||||
        may_terminate: true
 | 
			
		||||
        child_routes:
 | 
			
		||||
          'createWithArray':
 | 
			
		||||
            type: Literal
 | 
			
		||||
            options:
 | 
			
		||||
              route: /createWithArray
 | 
			
		||||
              defaults:
 | 
			
		||||
                handler: UserCreateWithArray
 | 
			
		||||
          'createWithList':
 | 
			
		||||
            type: Literal
 | 
			
		||||
            options:
 | 
			
		||||
              route: /createWithList
 | 
			
		||||
              defaults:
 | 
			
		||||
                handler: UserCreateWithList
 | 
			
		||||
          'login':
 | 
			
		||||
            type: Literal
 | 
			
		||||
            options:
 | 
			
		||||
              route: /login
 | 
			
		||||
              defaults:
 | 
			
		||||
                handler: UserLogin
 | 
			
		||||
          'logout':
 | 
			
		||||
            type: Literal
 | 
			
		||||
            options:
 | 
			
		||||
              route: /logout
 | 
			
		||||
              defaults:
 | 
			
		||||
                handler: UserLogout
 | 
			
		||||
          '{username}':
 | 
			
		||||
            type: Segment
 | 
			
		||||
            options:
 | 
			
		||||
              route: /:username
 | 
			
		||||
              defaults:
 | 
			
		||||
                handler: UserUsername
 | 
			
		||||
 | 
			
		||||
    default_params:
 | 
			
		||||
      middleware: ''
 | 
			
		||||
  metadata_cache:
 | 
			
		||||
    adapter:
 | 
			
		||||
      name: blackhole
 | 
			
		||||
#    adapter:
 | 
			
		||||
#      name: filesystem
 | 
			
		||||
#      options:
 | 
			
		||||
#        cache_dir: data/cache/path_handler
 | 
			
		||||
#        namespace: ph
 | 
			
		||||
 | 
			
		||||
  handlers:
 | 
			
		||||
    invokables:
 | 
			
		||||
      Pet: App\Handler\Pet
 | 
			
		||||
      PetFindByStatus: App\Handler\PetFindByStatus
 | 
			
		||||
      PetFindByTags: App\Handler\PetFindByTags
 | 
			
		||||
      PetPetId: App\Handler\PetPetId
 | 
			
		||||
      PetPetIdUploadImage: App\Handler\PetPetIdUploadImage
 | 
			
		||||
      StoreInventory: App\Handler\StoreInventory
 | 
			
		||||
      StoreOrder: App\Handler\StoreOrder
 | 
			
		||||
      StoreOrderOrderId: App\Handler\StoreOrderOrderId
 | 
			
		||||
      User: App\Handler\User
 | 
			
		||||
      UserCreateWithArray: App\Handler\UserCreateWithArray
 | 
			
		||||
      UserCreateWithList: App\Handler\UserCreateWithList
 | 
			
		||||
      UserLogin: App\Handler\UserLogin
 | 
			
		||||
      UserLogout: App\Handler\UserLogout
 | 
			
		||||
      UserUsername: App\Handler\UserUsername
 | 
			
		||||
#  consumers:
 | 
			
		||||
#  attributes:
 | 
			
		||||
#  producers:
 | 
			
		||||
							
								
								
									
										46
									
								
								samples/server/petstore/ze-ph/application/container.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								samples/server/petstore/ze-ph/application/container.php
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,46 @@
 | 
			
		||||
<?php
 | 
			
		||||
use Zend\Config\Factory as ConfigFactory;
 | 
			
		||||
 | 
			
		||||
//Use Composer autoload that includes code both from ../src and ../vendor
 | 
			
		||||
require __DIR__ . '/../vendor/autoload.php';
 | 
			
		||||
 | 
			
		||||
//Path to file for caching full configuration
 | 
			
		||||
const CONFIG_CACHE_PATH = __DIR__ . '/../data/cache/config.php';
 | 
			
		||||
 | 
			
		||||
//Get full configuration
 | 
			
		||||
$config = [];
 | 
			
		||||
if (is_readable(CONFIG_CACHE_PATH)) {
 | 
			
		||||
    $config = include CONFIG_CACHE_PATH;
 | 
			
		||||
} else {
 | 
			
		||||
    //Register extra extension for YAML files
 | 
			
		||||
    ConfigFactory::registerReader('yml', 'yaml');
 | 
			
		||||
 | 
			
		||||
    //Combine all configuration files in right order
 | 
			
		||||
    $config = ConfigFactory::fromFiles([
 | 
			
		||||
        __DIR__ . '/config/data_transfer.yml',
 | 
			
		||||
        __DIR__ . '/config/path_handler.yml',
 | 
			
		||||
        __DIR__ . '/config/app.yml',
 | 
			
		||||
        __DIR__ . '/config.yml',
 | 
			
		||||
    ]);
 | 
			
		||||
 | 
			
		||||
    //Cache full configuration
 | 
			
		||||
    if (isset($config['cache_configuration']) && $config['cache_configuration']) {
 | 
			
		||||
        if (!ConfigFactory::toFile(CONFIG_CACHE_PATH, $config)) {
 | 
			
		||||
            throw new \RuntimeException('Failed to cache configuration');
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
//Get configuration for container
 | 
			
		||||
$dependencies = [];
 | 
			
		||||
if (isset($config['dependencies'])) {
 | 
			
		||||
    $dependencies = $config['dependencies'];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//Create container
 | 
			
		||||
$container = new \Zend\ServiceManager\ServiceManager($dependencies);
 | 
			
		||||
 | 
			
		||||
//Register full configuration as a service
 | 
			
		||||
$container->setService('config', $config);
 | 
			
		||||
$container->setAlias('Config', 'config');
 | 
			
		||||
 | 
			
		||||
return $container;
 | 
			
		||||
							
								
								
									
										22
									
								
								samples/server/petstore/ze-ph/composer.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								samples/server/petstore/ze-ph/composer.json
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,22 @@
 | 
			
		||||
{
 | 
			
		||||
    "name": "GIT_USER_ID/GIT_REPO_ID",
 | 
			
		||||
    "description": "",
 | 
			
		||||
    "license": "proprietary",
 | 
			
		||||
    "version": "1.0.0",
 | 
			
		||||
    "type": "project",
 | 
			
		||||
    "require": {
 | 
			
		||||
        "php": "^5.6 || ^7.0",
 | 
			
		||||
        "ext-yaml" : "^1.2 || ^2.0",
 | 
			
		||||
        "zendframework/zend-expressive": "^1.0",
 | 
			
		||||
        "zendframework/zend-expressive-router": "1.2.*",
 | 
			
		||||
        "articus/path-handler": "0.1.*",
 | 
			
		||||
        "articus/data-transfer": "*",
 | 
			
		||||
        "zendframework/zend-serializer": "*",
 | 
			
		||||
        "zendframework/zend-config": "*"
 | 
			
		||||
    },
 | 
			
		||||
    "autoload": {
 | 
			
		||||
        "psr-4": {
 | 
			
		||||
            "": "src/"
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										10
									
								
								samples/server/petstore/ze-ph/public/index.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								samples/server/petstore/ze-ph/public/index.php
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,10 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
chdir(dirname(__DIR__));
 | 
			
		||||
 | 
			
		||||
/** @var \Zend\ServiceManager\ServiceManager $container */
 | 
			
		||||
$container = require_once __DIR__.'/../application/container.php';
 | 
			
		||||
 | 
			
		||||
/** @var \Zend\Expressive\Application $app */
 | 
			
		||||
$app = $container->get(\Zend\Expressive\Application::class);
 | 
			
		||||
$app->run();
 | 
			
		||||
							
								
								
									
										30
									
								
								samples/server/petstore/ze-ph/src/App/DTO/ApiResponse.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								samples/server/petstore/ze-ph/src/App/DTO/ApiResponse.php
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,30 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
namespace App\DTO;
 | 
			
		||||
 | 
			
		||||
use Articus\DataTransfer\Annotation as DTA;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 */
 | 
			
		||||
class ApiResponse 
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * @DTA\Data(field="code", nullable=true)
 | 
			
		||||
     * @DTA\Validator(name="Type", options={"type":"int"})
 | 
			
		||||
     * @var int
 | 
			
		||||
     */
 | 
			
		||||
    public $code;
 | 
			
		||||
    /**
 | 
			
		||||
     * @DTA\Data(field="type", nullable=true)
 | 
			
		||||
     * @DTA\Validator(name="Type", options={"type":"string"})
 | 
			
		||||
     * @var string
 | 
			
		||||
     */
 | 
			
		||||
    public $type;
 | 
			
		||||
    /**
 | 
			
		||||
     * @DTA\Data(field="message", nullable=true)
 | 
			
		||||
     * @DTA\Validator(name="Type", options={"type":"string"})
 | 
			
		||||
     * @var string
 | 
			
		||||
     */
 | 
			
		||||
    public $message;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										24
									
								
								samples/server/petstore/ze-ph/src/App/DTO/Category.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								samples/server/petstore/ze-ph/src/App/DTO/Category.php
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,24 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
namespace App\DTO;
 | 
			
		||||
 | 
			
		||||
use Articus\DataTransfer\Annotation as DTA;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 */
 | 
			
		||||
class Category 
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * @DTA\Data(field="id", nullable=true)
 | 
			
		||||
     * @DTA\Validator(name="Type", options={"type":"int"})
 | 
			
		||||
     * @var int
 | 
			
		||||
     */
 | 
			
		||||
    public $id;
 | 
			
		||||
    /**
 | 
			
		||||
     * @DTA\Data(field="name", nullable=true)
 | 
			
		||||
     * @DTA\Validator(name="Type", options={"type":"string"})
 | 
			
		||||
     * @var string
 | 
			
		||||
     */
 | 
			
		||||
    public $name;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										50
									
								
								samples/server/petstore/ze-ph/src/App/DTO/Order.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								samples/server/petstore/ze-ph/src/App/DTO/Order.php
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,50 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
namespace App\DTO;
 | 
			
		||||
 | 
			
		||||
use Articus\DataTransfer\Annotation as DTA;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 */
 | 
			
		||||
class Order 
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * @DTA\Data(field="id", nullable=true)
 | 
			
		||||
     * @DTA\Validator(name="Type", options={"type":"int"})
 | 
			
		||||
     * @var int
 | 
			
		||||
     */
 | 
			
		||||
    public $id;
 | 
			
		||||
    /**
 | 
			
		||||
     * @DTA\Data(field="petId", nullable=true)
 | 
			
		||||
     * @DTA\Validator(name="Type", options={"type":"int"})
 | 
			
		||||
     * @var int
 | 
			
		||||
     */
 | 
			
		||||
    public $pet_id;
 | 
			
		||||
    /**
 | 
			
		||||
     * @DTA\Data(field="quantity", nullable=true)
 | 
			
		||||
     * @DTA\Validator(name="Type", options={"type":"int"})
 | 
			
		||||
     * @var int
 | 
			
		||||
     */
 | 
			
		||||
    public $quantity;
 | 
			
		||||
    /**
 | 
			
		||||
     * @DTA\Data(field="shipDate", nullable=true)
 | 
			
		||||
     * @DTA\Strategy(name="DateTime")
 | 
			
		||||
     * @DTA\Validator(name="Date", options={"format": \DateTime::RFC3339})
 | 
			
		||||
     * @var \DateTime
 | 
			
		||||
     */
 | 
			
		||||
    public $ship_date;
 | 
			
		||||
    /**
 | 
			
		||||
     * Order Status
 | 
			
		||||
     * @DTA\Data(field="status", nullable=true)
 | 
			
		||||
     * @DTA\Validator(name="Type", options={"type":"string"})
 | 
			
		||||
     * @var string
 | 
			
		||||
     */
 | 
			
		||||
    public $status;
 | 
			
		||||
    /**
 | 
			
		||||
     * @DTA\Data(field="complete", nullable=true)
 | 
			
		||||
     * @DTA\Validator(name="Type", options={"type":"bool"})
 | 
			
		||||
     * @var bool
 | 
			
		||||
     */
 | 
			
		||||
    public $complete;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										55
									
								
								samples/server/petstore/ze-ph/src/App/DTO/Pet.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								samples/server/petstore/ze-ph/src/App/DTO/Pet.php
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,55 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
namespace App\DTO;
 | 
			
		||||
 | 
			
		||||
use Articus\DataTransfer\Annotation as DTA;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 */
 | 
			
		||||
class Pet 
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * @DTA\Data(field="id", nullable=true)
 | 
			
		||||
     * @DTA\Validator(name="Type", options={"type":"int"})
 | 
			
		||||
     * @var int
 | 
			
		||||
     */
 | 
			
		||||
    public $id;
 | 
			
		||||
    /**
 | 
			
		||||
     * @DTA\Data(field="category", nullable=true)
 | 
			
		||||
     * @DTA\Strategy(name="Object", options={"type":\App\DTO\Category::class})
 | 
			
		||||
     * @DTA\Validator(name="Dictionary", options={"type":\App\DTO\Category::class})
 | 
			
		||||
     * @var \App\DTO\Category
 | 
			
		||||
     */
 | 
			
		||||
    public $category;
 | 
			
		||||
    /**
 | 
			
		||||
     * @DTA\Data(field="name")
 | 
			
		||||
     * @DTA\Validator(name="Type", options={"type":"string"})
 | 
			
		||||
     * @var string
 | 
			
		||||
     */
 | 
			
		||||
    public $name;
 | 
			
		||||
    /**
 | 
			
		||||
     * @DTA\Data(field="photoUrls")
 | 
			
		||||
     * @DTA\Validator(name="Collection", options={"validators":{
 | 
			
		||||
     *     {"name":"Type", "options":{"type":"string"}}
 | 
			
		||||
     * }})
 | 
			
		||||
     * @var string[]
 | 
			
		||||
     */
 | 
			
		||||
    public $photo_urls;
 | 
			
		||||
    /**
 | 
			
		||||
     * @DTA\Data(field="tags", nullable=true)
 | 
			
		||||
     * @DTA\Strategy(name="ObjectArray", options={"type":\App\DTO\Tag::class})
 | 
			
		||||
     * @DTA\Validator(name="Collection", options={"validators":{
 | 
			
		||||
     *     {"name":"Dictionary", "options":{"type":\App\DTO\Tag::class}}
 | 
			
		||||
     * }})
 | 
			
		||||
     * @var \App\DTO\Tag[]
 | 
			
		||||
     */
 | 
			
		||||
    public $tags;
 | 
			
		||||
    /**
 | 
			
		||||
     * pet status in the store
 | 
			
		||||
     * @DTA\Data(field="status", nullable=true)
 | 
			
		||||
     * @DTA\Validator(name="Type", options={"type":"string"})
 | 
			
		||||
     * @var string
 | 
			
		||||
     */
 | 
			
		||||
    public $status;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										24
									
								
								samples/server/petstore/ze-ph/src/App/DTO/Tag.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								samples/server/petstore/ze-ph/src/App/DTO/Tag.php
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,24 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
namespace App\DTO;
 | 
			
		||||
 | 
			
		||||
use Articus\DataTransfer\Annotation as DTA;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 */
 | 
			
		||||
class Tag 
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * @DTA\Data(field="id", nullable=true)
 | 
			
		||||
     * @DTA\Validator(name="Type", options={"type":"int"})
 | 
			
		||||
     * @var int
 | 
			
		||||
     */
 | 
			
		||||
    public $id;
 | 
			
		||||
    /**
 | 
			
		||||
     * @DTA\Data(field="name", nullable=true)
 | 
			
		||||
     * @DTA\Validator(name="Type", options={"type":"string"})
 | 
			
		||||
     * @var string
 | 
			
		||||
     */
 | 
			
		||||
    public $name;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										61
									
								
								samples/server/petstore/ze-ph/src/App/DTO/User.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										61
									
								
								samples/server/petstore/ze-ph/src/App/DTO/User.php
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,61 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
namespace App\DTO;
 | 
			
		||||
 | 
			
		||||
use Articus\DataTransfer\Annotation as DTA;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 */
 | 
			
		||||
class User 
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * @DTA\Data(field="id", nullable=true)
 | 
			
		||||
     * @DTA\Validator(name="Type", options={"type":"int"})
 | 
			
		||||
     * @var int
 | 
			
		||||
     */
 | 
			
		||||
    public $id;
 | 
			
		||||
    /**
 | 
			
		||||
     * @DTA\Data(field="username", nullable=true)
 | 
			
		||||
     * @DTA\Validator(name="Type", options={"type":"string"})
 | 
			
		||||
     * @var string
 | 
			
		||||
     */
 | 
			
		||||
    public $username;
 | 
			
		||||
    /**
 | 
			
		||||
     * @DTA\Data(field="firstName", nullable=true)
 | 
			
		||||
     * @DTA\Validator(name="Type", options={"type":"string"})
 | 
			
		||||
     * @var string
 | 
			
		||||
     */
 | 
			
		||||
    public $first_name;
 | 
			
		||||
    /**
 | 
			
		||||
     * @DTA\Data(field="lastName", nullable=true)
 | 
			
		||||
     * @DTA\Validator(name="Type", options={"type":"string"})
 | 
			
		||||
     * @var string
 | 
			
		||||
     */
 | 
			
		||||
    public $last_name;
 | 
			
		||||
    /**
 | 
			
		||||
     * @DTA\Data(field="email", nullable=true)
 | 
			
		||||
     * @DTA\Validator(name="Type", options={"type":"string"})
 | 
			
		||||
     * @var string
 | 
			
		||||
     */
 | 
			
		||||
    public $email;
 | 
			
		||||
    /**
 | 
			
		||||
     * @DTA\Data(field="password", nullable=true)
 | 
			
		||||
     * @DTA\Validator(name="Type", options={"type":"string"})
 | 
			
		||||
     * @var string
 | 
			
		||||
     */
 | 
			
		||||
    public $password;
 | 
			
		||||
    /**
 | 
			
		||||
     * @DTA\Data(field="phone", nullable=true)
 | 
			
		||||
     * @DTA\Validator(name="Type", options={"type":"string"})
 | 
			
		||||
     * @var string
 | 
			
		||||
     */
 | 
			
		||||
    public $phone;
 | 
			
		||||
    /**
 | 
			
		||||
     * User Status
 | 
			
		||||
     * @DTA\Data(field="userStatus", nullable=true)
 | 
			
		||||
     * @DTA\Validator(name="Type", options={"type":"int"})
 | 
			
		||||
     * @var int
 | 
			
		||||
     */
 | 
			
		||||
    public $user_status;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										20
									
								
								samples/server/petstore/ze-ph/src/App/ErrorMiddleware.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								samples/server/petstore/ze-ph/src/App/ErrorMiddleware.php
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,20 @@
 | 
			
		||||
<?php
 | 
			
		||||
namespace App;
 | 
			
		||||
 | 
			
		||||
use Psr\Http\Message\ResponseInterface as Response;
 | 
			
		||||
use Psr\Http\Message\ServerRequestInterface as Request;
 | 
			
		||||
use Zend\Stratigility\ErrorMiddlewareInterface;
 | 
			
		||||
 | 
			
		||||
class ErrorMiddleware implements ErrorMiddlewareInterface
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * @inheritDoc
 | 
			
		||||
     */
 | 
			
		||||
    public function __invoke($error, Request $request, Response $response, callable $out = null)
 | 
			
		||||
    {
 | 
			
		||||
        $response = $response->withStatus(500, 'Internal server error');
 | 
			
		||||
        $response->getBody()->write((string)$error);
 | 
			
		||||
        error_log((string) $error);
 | 
			
		||||
        return ($out === null)? $response : $out($request, $response);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										54
									
								
								samples/server/petstore/ze-ph/src/App/Handler/Pet.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								samples/server/petstore/ze-ph/src/App/Handler/Pet.php
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,54 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
namespace App\Handler;
 | 
			
		||||
 | 
			
		||||
use Articus\PathHandler\Operation;
 | 
			
		||||
use Articus\PathHandler\Annotation as PHA;
 | 
			
		||||
use Articus\PathHandler\Consumer as PHConsumer;
 | 
			
		||||
use Articus\PathHandler\Producer as PHProducer;
 | 
			
		||||
use Articus\PathHandler\Attribute as PHAttribute;
 | 
			
		||||
use Articus\PathHandler\Exception as PHException;
 | 
			
		||||
use Psr\Http\Message\ServerRequestInterface;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class Pet implements Operation\PostInterface, Operation\PutInterface
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * Add a new pet to the store
 | 
			
		||||
     * TODO check if consumer is valid, if it has correct priority and if it can be moved to class annotation
 | 
			
		||||
     * @PHA\Consumer(name=PHConsumer\Json::class, mediaType="application/json")
 | 
			
		||||
     * TODO check if consumer is valid, if it has correct priority and if it can be moved to class annotation
 | 
			
		||||
     * @PHA\Consumer(name=PHConsumer\Json::class, mediaType="application/xml")
 | 
			
		||||
     * @PHA\Attribute(name=PHAttribute\Transfer::class, options={"type":\App\DTO\Pet::class,"objectAttr":"body"})
 | 
			
		||||
     * TODO check if producer is valid, if it has correct priority and if it can be moved to class annotation
 | 
			
		||||
     * @PHA\Producer(name=PHProducer\Transfer::class, mediaType="application/xml")
 | 
			
		||||
     * TODO check if producer is valid, if it has correct priority and if it can be moved to class annotation
 | 
			
		||||
     * @PHA\Producer(name=PHProducer\Transfer::class, mediaType="application/json")
 | 
			
		||||
     */
 | 
			
		||||
    public function handlePost(ServerRequestInterface $request)
 | 
			
		||||
    {
 | 
			
		||||
        //TODO implement method
 | 
			
		||||
        /** @var \App\DTO\Pet $body */
 | 
			
		||||
        $body = $request->getAttribute("body");
 | 
			
		||||
        throw new PHException\HttpCode(500, "Not implemented");
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Update an existing pet
 | 
			
		||||
     * TODO check if consumer is valid, if it has correct priority and if it can be moved to class annotation
 | 
			
		||||
     * @PHA\Consumer(name=PHConsumer\Json::class, mediaType="application/json")
 | 
			
		||||
     * TODO check if consumer is valid, if it has correct priority and if it can be moved to class annotation
 | 
			
		||||
     * @PHA\Consumer(name=PHConsumer\Json::class, mediaType="application/xml")
 | 
			
		||||
     * @PHA\Attribute(name=PHAttribute\Transfer::class, options={"type":\App\DTO\Pet::class,"objectAttr":"body"})
 | 
			
		||||
     * TODO check if producer is valid, if it has correct priority and if it can be moved to class annotation
 | 
			
		||||
     * @PHA\Producer(name=PHProducer\Transfer::class, mediaType="application/xml")
 | 
			
		||||
     * TODO check if producer is valid, if it has correct priority and if it can be moved to class annotation
 | 
			
		||||
     * @PHA\Producer(name=PHProducer\Transfer::class, mediaType="application/json")
 | 
			
		||||
     */
 | 
			
		||||
    public function handlePut(ServerRequestInterface $request)
 | 
			
		||||
    {
 | 
			
		||||
        //TODO implement method
 | 
			
		||||
        /** @var \App\DTO\Pet $body */
 | 
			
		||||
        $body = $request->getAttribute("body");
 | 
			
		||||
        throw new PHException\HttpCode(500, "Not implemented");
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -0,0 +1,29 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
namespace App\Handler;
 | 
			
		||||
 | 
			
		||||
use Articus\PathHandler\Operation;
 | 
			
		||||
use Articus\PathHandler\Annotation as PHA;
 | 
			
		||||
use Articus\PathHandler\Consumer as PHConsumer;
 | 
			
		||||
use Articus\PathHandler\Producer as PHProducer;
 | 
			
		||||
use Articus\PathHandler\Attribute as PHAttribute;
 | 
			
		||||
use Articus\PathHandler\Exception as PHException;
 | 
			
		||||
use Psr\Http\Message\ServerRequestInterface;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class PetFindByStatus implements Operation\GetInterface
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * Finds Pets by status
 | 
			
		||||
     * TODO check if producer is valid, if it has correct priority and if it can be moved to class annotation
 | 
			
		||||
     * @PHA\Producer(name=PHProducer\Transfer::class, mediaType="application/xml")
 | 
			
		||||
     * TODO check if producer is valid, if it has correct priority and if it can be moved to class annotation
 | 
			
		||||
     * @PHA\Producer(name=PHProducer\Transfer::class, mediaType="application/json")
 | 
			
		||||
     * @return \App\DTO\Pet[]
 | 
			
		||||
     */
 | 
			
		||||
    public function handleGet(ServerRequestInterface $request)
 | 
			
		||||
    {
 | 
			
		||||
        //TODO implement method
 | 
			
		||||
        throw new PHException\HttpCode(500, "Not implemented");
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -0,0 +1,29 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
namespace App\Handler;
 | 
			
		||||
 | 
			
		||||
use Articus\PathHandler\Operation;
 | 
			
		||||
use Articus\PathHandler\Annotation as PHA;
 | 
			
		||||
use Articus\PathHandler\Consumer as PHConsumer;
 | 
			
		||||
use Articus\PathHandler\Producer as PHProducer;
 | 
			
		||||
use Articus\PathHandler\Attribute as PHAttribute;
 | 
			
		||||
use Articus\PathHandler\Exception as PHException;
 | 
			
		||||
use Psr\Http\Message\ServerRequestInterface;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class PetFindByTags implements Operation\GetInterface
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * Finds Pets by tags
 | 
			
		||||
     * TODO check if producer is valid, if it has correct priority and if it can be moved to class annotation
 | 
			
		||||
     * @PHA\Producer(name=PHProducer\Transfer::class, mediaType="application/xml")
 | 
			
		||||
     * TODO check if producer is valid, if it has correct priority and if it can be moved to class annotation
 | 
			
		||||
     * @PHA\Producer(name=PHProducer\Transfer::class, mediaType="application/json")
 | 
			
		||||
     * @return \App\DTO\Pet[]
 | 
			
		||||
     */
 | 
			
		||||
    public function handleGet(ServerRequestInterface $request)
 | 
			
		||||
    {
 | 
			
		||||
        //TODO implement method
 | 
			
		||||
        throw new PHException\HttpCode(500, "Not implemented");
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										53
									
								
								samples/server/petstore/ze-ph/src/App/Handler/PetPetId.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								samples/server/petstore/ze-ph/src/App/Handler/PetPetId.php
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,53 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
namespace App\Handler;
 | 
			
		||||
 | 
			
		||||
use Articus\PathHandler\Operation;
 | 
			
		||||
use Articus\PathHandler\Annotation as PHA;
 | 
			
		||||
use Articus\PathHandler\Consumer as PHConsumer;
 | 
			
		||||
use Articus\PathHandler\Producer as PHProducer;
 | 
			
		||||
use Articus\PathHandler\Attribute as PHAttribute;
 | 
			
		||||
use Articus\PathHandler\Exception as PHException;
 | 
			
		||||
use Psr\Http\Message\ServerRequestInterface;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class PetPetId implements Operation\DeleteInterface, Operation\GetInterface, Operation\PostInterface
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * Deletes a pet
 | 
			
		||||
     * TODO check if producer is valid, if it has correct priority and if it can be moved to class annotation
 | 
			
		||||
     * @PHA\Producer(name=PHProducer\Transfer::class, mediaType="application/xml")
 | 
			
		||||
     * TODO check if producer is valid, if it has correct priority and if it can be moved to class annotation
 | 
			
		||||
     * @PHA\Producer(name=PHProducer\Transfer::class, mediaType="application/json")
 | 
			
		||||
     */
 | 
			
		||||
    public function handleDelete(ServerRequestInterface $request)
 | 
			
		||||
    {
 | 
			
		||||
        //TODO implement method
 | 
			
		||||
        throw new PHException\HttpCode(500, "Not implemented");
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Find pet by ID
 | 
			
		||||
     * TODO check if producer is valid, if it has correct priority and if it can be moved to class annotation
 | 
			
		||||
     * @PHA\Producer(name=PHProducer\Transfer::class, mediaType="application/xml")
 | 
			
		||||
     * TODO check if producer is valid, if it has correct priority and if it can be moved to class annotation
 | 
			
		||||
     * @PHA\Producer(name=PHProducer\Transfer::class, mediaType="application/json")
 | 
			
		||||
     * @return \App\DTO\Pet
 | 
			
		||||
     */
 | 
			
		||||
    public function handleGet(ServerRequestInterface $request)
 | 
			
		||||
    {
 | 
			
		||||
        //TODO implement method
 | 
			
		||||
        throw new PHException\HttpCode(500, "Not implemented");
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Updates a pet in the store with form data
 | 
			
		||||
     * TODO check if producer is valid, if it has correct priority and if it can be moved to class annotation
 | 
			
		||||
     * @PHA\Producer(name=PHProducer\Transfer::class, mediaType="application/xml")
 | 
			
		||||
     * TODO check if producer is valid, if it has correct priority and if it can be moved to class annotation
 | 
			
		||||
     * @PHA\Producer(name=PHProducer\Transfer::class, mediaType="application/json")
 | 
			
		||||
     */
 | 
			
		||||
    public function handlePost(ServerRequestInterface $request)
 | 
			
		||||
    {
 | 
			
		||||
        //TODO implement method
 | 
			
		||||
        throw new PHException\HttpCode(500, "Not implemented");
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -0,0 +1,27 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
namespace App\Handler;
 | 
			
		||||
 | 
			
		||||
use Articus\PathHandler\Operation;
 | 
			
		||||
use Articus\PathHandler\Annotation as PHA;
 | 
			
		||||
use Articus\PathHandler\Consumer as PHConsumer;
 | 
			
		||||
use Articus\PathHandler\Producer as PHProducer;
 | 
			
		||||
use Articus\PathHandler\Attribute as PHAttribute;
 | 
			
		||||
use Articus\PathHandler\Exception as PHException;
 | 
			
		||||
use Psr\Http\Message\ServerRequestInterface;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class PetPetIdUploadImage implements Operation\PostInterface
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * uploads an image
 | 
			
		||||
     * TODO check if producer is valid, if it has correct priority and if it can be moved to class annotation
 | 
			
		||||
     * @PHA\Producer(name=PHProducer\Transfer::class, mediaType="application/json")
 | 
			
		||||
     * @return \App\DTO\ApiResponse
 | 
			
		||||
     */
 | 
			
		||||
    public function handlePost(ServerRequestInterface $request)
 | 
			
		||||
    {
 | 
			
		||||
        //TODO implement method
 | 
			
		||||
        throw new PHException\HttpCode(500, "Not implemented");
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -0,0 +1,27 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
namespace App\Handler;
 | 
			
		||||
 | 
			
		||||
use Articus\PathHandler\Operation;
 | 
			
		||||
use Articus\PathHandler\Annotation as PHA;
 | 
			
		||||
use Articus\PathHandler\Consumer as PHConsumer;
 | 
			
		||||
use Articus\PathHandler\Producer as PHProducer;
 | 
			
		||||
use Articus\PathHandler\Attribute as PHAttribute;
 | 
			
		||||
use Articus\PathHandler\Exception as PHException;
 | 
			
		||||
use Psr\Http\Message\ServerRequestInterface;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class StoreInventory implements Operation\GetInterface
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * Returns pet inventories by status
 | 
			
		||||
     * TODO check if producer is valid, if it has correct priority and if it can be moved to class annotation
 | 
			
		||||
     * @PHA\Producer(name=PHProducer\Transfer::class, mediaType="application/json")
 | 
			
		||||
     * @return map[string,int]
 | 
			
		||||
     */
 | 
			
		||||
    public function handleGet(ServerRequestInterface $request)
 | 
			
		||||
    {
 | 
			
		||||
        //TODO implement method
 | 
			
		||||
        throw new PHException\HttpCode(500, "Not implemented");
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										32
									
								
								samples/server/petstore/ze-ph/src/App/Handler/StoreOrder.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								samples/server/petstore/ze-ph/src/App/Handler/StoreOrder.php
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,32 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
namespace App\Handler;
 | 
			
		||||
 | 
			
		||||
use Articus\PathHandler\Operation;
 | 
			
		||||
use Articus\PathHandler\Annotation as PHA;
 | 
			
		||||
use Articus\PathHandler\Consumer as PHConsumer;
 | 
			
		||||
use Articus\PathHandler\Producer as PHProducer;
 | 
			
		||||
use Articus\PathHandler\Attribute as PHAttribute;
 | 
			
		||||
use Articus\PathHandler\Exception as PHException;
 | 
			
		||||
use Psr\Http\Message\ServerRequestInterface;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class StoreOrder implements Operation\PostInterface
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * Place an order for a pet
 | 
			
		||||
     * @PHA\Attribute(name=PHAttribute\Transfer::class, options={"type":\App\DTO\Order::class,"objectAttr":"body"})
 | 
			
		||||
     * TODO check if producer is valid, if it has correct priority and if it can be moved to class annotation
 | 
			
		||||
     * @PHA\Producer(name=PHProducer\Transfer::class, mediaType="application/xml")
 | 
			
		||||
     * TODO check if producer is valid, if it has correct priority and if it can be moved to class annotation
 | 
			
		||||
     * @PHA\Producer(name=PHProducer\Transfer::class, mediaType="application/json")
 | 
			
		||||
     * @return \App\DTO\Order
 | 
			
		||||
     */
 | 
			
		||||
    public function handlePost(ServerRequestInterface $request)
 | 
			
		||||
    {
 | 
			
		||||
        //TODO implement method
 | 
			
		||||
        /** @var \App\DTO\Order $body */
 | 
			
		||||
        $body = $request->getAttribute("body");
 | 
			
		||||
        throw new PHException\HttpCode(500, "Not implemented");
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -0,0 +1,41 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
namespace App\Handler;
 | 
			
		||||
 | 
			
		||||
use Articus\PathHandler\Operation;
 | 
			
		||||
use Articus\PathHandler\Annotation as PHA;
 | 
			
		||||
use Articus\PathHandler\Consumer as PHConsumer;
 | 
			
		||||
use Articus\PathHandler\Producer as PHProducer;
 | 
			
		||||
use Articus\PathHandler\Attribute as PHAttribute;
 | 
			
		||||
use Articus\PathHandler\Exception as PHException;
 | 
			
		||||
use Psr\Http\Message\ServerRequestInterface;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class StoreOrderOrderId implements Operation\DeleteInterface, Operation\GetInterface
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * Delete purchase order by ID
 | 
			
		||||
     * TODO check if producer is valid, if it has correct priority and if it can be moved to class annotation
 | 
			
		||||
     * @PHA\Producer(name=PHProducer\Transfer::class, mediaType="application/xml")
 | 
			
		||||
     * TODO check if producer is valid, if it has correct priority and if it can be moved to class annotation
 | 
			
		||||
     * @PHA\Producer(name=PHProducer\Transfer::class, mediaType="application/json")
 | 
			
		||||
     */
 | 
			
		||||
    public function handleDelete(ServerRequestInterface $request)
 | 
			
		||||
    {
 | 
			
		||||
        //TODO implement method
 | 
			
		||||
        throw new PHException\HttpCode(500, "Not implemented");
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Find purchase order by ID
 | 
			
		||||
     * TODO check if producer is valid, if it has correct priority and if it can be moved to class annotation
 | 
			
		||||
     * @PHA\Producer(name=PHProducer\Transfer::class, mediaType="application/xml")
 | 
			
		||||
     * TODO check if producer is valid, if it has correct priority and if it can be moved to class annotation
 | 
			
		||||
     * @PHA\Producer(name=PHProducer\Transfer::class, mediaType="application/json")
 | 
			
		||||
     * @return \App\DTO\Order
 | 
			
		||||
     */
 | 
			
		||||
    public function handleGet(ServerRequestInterface $request)
 | 
			
		||||
    {
 | 
			
		||||
        //TODO implement method
 | 
			
		||||
        throw new PHException\HttpCode(500, "Not implemented");
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										31
									
								
								samples/server/petstore/ze-ph/src/App/Handler/User.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								samples/server/petstore/ze-ph/src/App/Handler/User.php
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,31 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
namespace App\Handler;
 | 
			
		||||
 | 
			
		||||
use Articus\PathHandler\Operation;
 | 
			
		||||
use Articus\PathHandler\Annotation as PHA;
 | 
			
		||||
use Articus\PathHandler\Consumer as PHConsumer;
 | 
			
		||||
use Articus\PathHandler\Producer as PHProducer;
 | 
			
		||||
use Articus\PathHandler\Attribute as PHAttribute;
 | 
			
		||||
use Articus\PathHandler\Exception as PHException;
 | 
			
		||||
use Psr\Http\Message\ServerRequestInterface;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class User implements Operation\PostInterface
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * Create user
 | 
			
		||||
     * @PHA\Attribute(name=PHAttribute\Transfer::class, options={"type":\App\DTO\User::class,"objectAttr":"body"})
 | 
			
		||||
     * TODO check if producer is valid, if it has correct priority and if it can be moved to class annotation
 | 
			
		||||
     * @PHA\Producer(name=PHProducer\Transfer::class, mediaType="application/xml")
 | 
			
		||||
     * TODO check if producer is valid, if it has correct priority and if it can be moved to class annotation
 | 
			
		||||
     * @PHA\Producer(name=PHProducer\Transfer::class, mediaType="application/json")
 | 
			
		||||
     */
 | 
			
		||||
    public function handlePost(ServerRequestInterface $request)
 | 
			
		||||
    {
 | 
			
		||||
        //TODO implement method
 | 
			
		||||
        /** @var \App\DTO\User $body */
 | 
			
		||||
        $body = $request->getAttribute("body");
 | 
			
		||||
        throw new PHException\HttpCode(500, "Not implemented");
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -0,0 +1,31 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
namespace App\Handler;
 | 
			
		||||
 | 
			
		||||
use Articus\PathHandler\Operation;
 | 
			
		||||
use Articus\PathHandler\Annotation as PHA;
 | 
			
		||||
use Articus\PathHandler\Consumer as PHConsumer;
 | 
			
		||||
use Articus\PathHandler\Producer as PHProducer;
 | 
			
		||||
use Articus\PathHandler\Attribute as PHAttribute;
 | 
			
		||||
use Articus\PathHandler\Exception as PHException;
 | 
			
		||||
use Psr\Http\Message\ServerRequestInterface;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class UserCreateWithArray implements Operation\PostInterface
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * Creates list of users with given input array
 | 
			
		||||
     * @PHA\Attribute(name=PHAttribute\Transfer::class, options={"type":\App\DTO\User[]::class,"objectAttr":"body"})
 | 
			
		||||
     * TODO check if producer is valid, if it has correct priority and if it can be moved to class annotation
 | 
			
		||||
     * @PHA\Producer(name=PHProducer\Transfer::class, mediaType="application/xml")
 | 
			
		||||
     * TODO check if producer is valid, if it has correct priority and if it can be moved to class annotation
 | 
			
		||||
     * @PHA\Producer(name=PHProducer\Transfer::class, mediaType="application/json")
 | 
			
		||||
     */
 | 
			
		||||
    public function handlePost(ServerRequestInterface $request)
 | 
			
		||||
    {
 | 
			
		||||
        //TODO implement method
 | 
			
		||||
        /** @var \App\DTO\User[] $body */
 | 
			
		||||
        $body = $request->getAttribute("body");
 | 
			
		||||
        throw new PHException\HttpCode(500, "Not implemented");
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -0,0 +1,31 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
namespace App\Handler;
 | 
			
		||||
 | 
			
		||||
use Articus\PathHandler\Operation;
 | 
			
		||||
use Articus\PathHandler\Annotation as PHA;
 | 
			
		||||
use Articus\PathHandler\Consumer as PHConsumer;
 | 
			
		||||
use Articus\PathHandler\Producer as PHProducer;
 | 
			
		||||
use Articus\PathHandler\Attribute as PHAttribute;
 | 
			
		||||
use Articus\PathHandler\Exception as PHException;
 | 
			
		||||
use Psr\Http\Message\ServerRequestInterface;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class UserCreateWithList implements Operation\PostInterface
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * Creates list of users with given input array
 | 
			
		||||
     * @PHA\Attribute(name=PHAttribute\Transfer::class, options={"type":\App\DTO\User[]::class,"objectAttr":"body"})
 | 
			
		||||
     * TODO check if producer is valid, if it has correct priority and if it can be moved to class annotation
 | 
			
		||||
     * @PHA\Producer(name=PHProducer\Transfer::class, mediaType="application/xml")
 | 
			
		||||
     * TODO check if producer is valid, if it has correct priority and if it can be moved to class annotation
 | 
			
		||||
     * @PHA\Producer(name=PHProducer\Transfer::class, mediaType="application/json")
 | 
			
		||||
     */
 | 
			
		||||
    public function handlePost(ServerRequestInterface $request)
 | 
			
		||||
    {
 | 
			
		||||
        //TODO implement method
 | 
			
		||||
        /** @var \App\DTO\User[] $body */
 | 
			
		||||
        $body = $request->getAttribute("body");
 | 
			
		||||
        throw new PHException\HttpCode(500, "Not implemented");
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										29
									
								
								samples/server/petstore/ze-ph/src/App/Handler/UserLogin.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								samples/server/petstore/ze-ph/src/App/Handler/UserLogin.php
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,29 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
namespace App\Handler;
 | 
			
		||||
 | 
			
		||||
use Articus\PathHandler\Operation;
 | 
			
		||||
use Articus\PathHandler\Annotation as PHA;
 | 
			
		||||
use Articus\PathHandler\Consumer as PHConsumer;
 | 
			
		||||
use Articus\PathHandler\Producer as PHProducer;
 | 
			
		||||
use Articus\PathHandler\Attribute as PHAttribute;
 | 
			
		||||
use Articus\PathHandler\Exception as PHException;
 | 
			
		||||
use Psr\Http\Message\ServerRequestInterface;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class UserLogin implements Operation\GetInterface
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * Logs user into the system
 | 
			
		||||
     * TODO check if producer is valid, if it has correct priority and if it can be moved to class annotation
 | 
			
		||||
     * @PHA\Producer(name=PHProducer\Transfer::class, mediaType="application/xml")
 | 
			
		||||
     * TODO check if producer is valid, if it has correct priority and if it can be moved to class annotation
 | 
			
		||||
     * @PHA\Producer(name=PHProducer\Transfer::class, mediaType="application/json")
 | 
			
		||||
     * @return string
 | 
			
		||||
     */
 | 
			
		||||
    public function handleGet(ServerRequestInterface $request)
 | 
			
		||||
    {
 | 
			
		||||
        //TODO implement method
 | 
			
		||||
        throw new PHException\HttpCode(500, "Not implemented");
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										28
									
								
								samples/server/petstore/ze-ph/src/App/Handler/UserLogout.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								samples/server/petstore/ze-ph/src/App/Handler/UserLogout.php
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,28 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
namespace App\Handler;
 | 
			
		||||
 | 
			
		||||
use Articus\PathHandler\Operation;
 | 
			
		||||
use Articus\PathHandler\Annotation as PHA;
 | 
			
		||||
use Articus\PathHandler\Consumer as PHConsumer;
 | 
			
		||||
use Articus\PathHandler\Producer as PHProducer;
 | 
			
		||||
use Articus\PathHandler\Attribute as PHAttribute;
 | 
			
		||||
use Articus\PathHandler\Exception as PHException;
 | 
			
		||||
use Psr\Http\Message\ServerRequestInterface;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class UserLogout implements Operation\GetInterface
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * Logs out current logged in user session
 | 
			
		||||
     * TODO check if producer is valid, if it has correct priority and if it can be moved to class annotation
 | 
			
		||||
     * @PHA\Producer(name=PHProducer\Transfer::class, mediaType="application/xml")
 | 
			
		||||
     * TODO check if producer is valid, if it has correct priority and if it can be moved to class annotation
 | 
			
		||||
     * @PHA\Producer(name=PHProducer\Transfer::class, mediaType="application/json")
 | 
			
		||||
     */
 | 
			
		||||
    public function handleGet(ServerRequestInterface $request)
 | 
			
		||||
    {
 | 
			
		||||
        //TODO implement method
 | 
			
		||||
        throw new PHException\HttpCode(500, "Not implemented");
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -0,0 +1,56 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
namespace App\Handler;
 | 
			
		||||
 | 
			
		||||
use Articus\PathHandler\Operation;
 | 
			
		||||
use Articus\PathHandler\Annotation as PHA;
 | 
			
		||||
use Articus\PathHandler\Consumer as PHConsumer;
 | 
			
		||||
use Articus\PathHandler\Producer as PHProducer;
 | 
			
		||||
use Articus\PathHandler\Attribute as PHAttribute;
 | 
			
		||||
use Articus\PathHandler\Exception as PHException;
 | 
			
		||||
use Psr\Http\Message\ServerRequestInterface;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class UserUsername implements Operation\DeleteInterface, Operation\GetInterface, Operation\PutInterface
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * Delete user
 | 
			
		||||
     * TODO check if producer is valid, if it has correct priority and if it can be moved to class annotation
 | 
			
		||||
     * @PHA\Producer(name=PHProducer\Transfer::class, mediaType="application/xml")
 | 
			
		||||
     * TODO check if producer is valid, if it has correct priority and if it can be moved to class annotation
 | 
			
		||||
     * @PHA\Producer(name=PHProducer\Transfer::class, mediaType="application/json")
 | 
			
		||||
     */
 | 
			
		||||
    public function handleDelete(ServerRequestInterface $request)
 | 
			
		||||
    {
 | 
			
		||||
        //TODO implement method
 | 
			
		||||
        throw new PHException\HttpCode(500, "Not implemented");
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Get user by user name
 | 
			
		||||
     * TODO check if producer is valid, if it has correct priority and if it can be moved to class annotation
 | 
			
		||||
     * @PHA\Producer(name=PHProducer\Transfer::class, mediaType="application/xml")
 | 
			
		||||
     * TODO check if producer is valid, if it has correct priority and if it can be moved to class annotation
 | 
			
		||||
     * @PHA\Producer(name=PHProducer\Transfer::class, mediaType="application/json")
 | 
			
		||||
     * @return \App\DTO\User
 | 
			
		||||
     */
 | 
			
		||||
    public function handleGet(ServerRequestInterface $request)
 | 
			
		||||
    {
 | 
			
		||||
        //TODO implement method
 | 
			
		||||
        throw new PHException\HttpCode(500, "Not implemented");
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Updated user
 | 
			
		||||
     * @PHA\Attribute(name=PHAttribute\Transfer::class, options={"type":\App\DTO\User::class,"objectAttr":"body"})
 | 
			
		||||
     * TODO check if producer is valid, if it has correct priority and if it can be moved to class annotation
 | 
			
		||||
     * @PHA\Producer(name=PHProducer\Transfer::class, mediaType="application/xml")
 | 
			
		||||
     * TODO check if producer is valid, if it has correct priority and if it can be moved to class annotation
 | 
			
		||||
     * @PHA\Producer(name=PHProducer\Transfer::class, mediaType="application/json")
 | 
			
		||||
     */
 | 
			
		||||
    public function handlePut(ServerRequestInterface $request)
 | 
			
		||||
    {
 | 
			
		||||
        //TODO implement method
 | 
			
		||||
        /** @var \App\DTO\User $body */
 | 
			
		||||
        $body = $request->getAttribute("body");
 | 
			
		||||
        throw new PHException\HttpCode(500, "Not implemented");
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										17
									
								
								samples/server/petstore/ze-ph/src/App/Strategy/Date.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								samples/server/petstore/ze-ph/src/App/Strategy/Date.php
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,17 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
namespace App\Strategy;
 | 
			
		||||
 | 
			
		||||
class Date extends DateTime
 | 
			
		||||
{
 | 
			
		||||
    const DATE_TIME_FORMAT = 'Y-m-d';
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @param $arrayValue
 | 
			
		||||
     * @return \DateTime
 | 
			
		||||
     */
 | 
			
		||||
    protected function parseDateString($arrayValue)
 | 
			
		||||
    {
 | 
			
		||||
        return \DateTime::createFromFormat(static::DATE_TIME_FORMAT.' H:i:sP', $arrayValue.' 00:00:00+00:00', new \DateTimeZone('UTC'));
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										44
									
								
								samples/server/petstore/ze-ph/src/App/Strategy/DateTime.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								samples/server/petstore/ze-ph/src/App/Strategy/DateTime.php
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,44 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
namespace App\Strategy;
 | 
			
		||||
use Articus\DataTransfer\Strategy\StrategyInterface;
 | 
			
		||||
 | 
			
		||||
class DateTime implements StrategyInterface
 | 
			
		||||
{
 | 
			
		||||
    const DATE_TIME_FORMAT = \DateTime::RFC3339;
 | 
			
		||||
    /**
 | 
			
		||||
     * @inheritDoc
 | 
			
		||||
     */
 | 
			
		||||
    public function extract($objectValue, $object = null)
 | 
			
		||||
    {
 | 
			
		||||
        $result = null;
 | 
			
		||||
        if ($objectValue instanceof \DateTime) {
 | 
			
		||||
            $result = $objectValue->format(static::DATE_TIME_FORMAT);
 | 
			
		||||
        }
 | 
			
		||||
        return $result;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @inheritDoc
 | 
			
		||||
     */
 | 
			
		||||
    public function hydrate($arrayValue, $objectValue, array $array = null)
 | 
			
		||||
    {
 | 
			
		||||
        $result = null;
 | 
			
		||||
        if (!empty($arrayValue)) {
 | 
			
		||||
            $date = $this->parseDateString($arrayValue);
 | 
			
		||||
            if ($date instanceof \DateTime) {
 | 
			
		||||
                $result = $date;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return $result;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @param $arrayValue
 | 
			
		||||
     * @return \DateTime
 | 
			
		||||
     */
 | 
			
		||||
    protected function parseDateString($arrayValue)
 | 
			
		||||
    {
 | 
			
		||||
        return \DateTime::createFromFormat(static::DATE_TIME_FORMAT, $arrayValue, new \DateTimeZone('UTC'));
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										71
									
								
								samples/server/petstore/ze-ph/src/App/Validator/Type.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										71
									
								
								samples/server/petstore/ze-ph/src/App/Validator/Type.php
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,71 @@
 | 
			
		||||
<?php
 | 
			
		||||
namespace App\Validator;
 | 
			
		||||
 | 
			
		||||
use Zend\Validator\AbstractValidator;
 | 
			
		||||
use Zend\Validator\Exception;
 | 
			
		||||
 | 
			
		||||
class Type extends AbstractValidator
 | 
			
		||||
{
 | 
			
		||||
    const INVALID = 'typeInvalid';
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Validation failure message template definitions
 | 
			
		||||
     *
 | 
			
		||||
     * @var array
 | 
			
		||||
     */
 | 
			
		||||
    protected $messageTemplates = [
 | 
			
		||||
        self::INVALID => 'Invalid type given.',
 | 
			
		||||
    ];
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @var string
 | 
			
		||||
     */
 | 
			
		||||
    protected $type;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @return mixed
 | 
			
		||||
     */
 | 
			
		||||
    public function getType()
 | 
			
		||||
    {
 | 
			
		||||
        return $this->type;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @param string $type
 | 
			
		||||
     * @return self
 | 
			
		||||
     */
 | 
			
		||||
    public function setType($type)
 | 
			
		||||
    {
 | 
			
		||||
        $this->type = $type;
 | 
			
		||||
        return $this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @inheritDoc
 | 
			
		||||
     */
 | 
			
		||||
    public function isValid($value)
 | 
			
		||||
    {
 | 
			
		||||
        $result = true;
 | 
			
		||||
        if (!$this->checkType($value)) {
 | 
			
		||||
            $this->error(self::INVALID);
 | 
			
		||||
            $result = false;
 | 
			
		||||
        }
 | 
			
		||||
        return $result;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    protected function checkType($value)
 | 
			
		||||
    {
 | 
			
		||||
        switch ($this->type) {
 | 
			
		||||
            case 'int':
 | 
			
		||||
                return is_int($value);
 | 
			
		||||
            case 'bool':
 | 
			
		||||
                return is_bool($value);
 | 
			
		||||
            case 'float':
 | 
			
		||||
                return is_float($value) || is_int($value);
 | 
			
		||||
            case 'string':
 | 
			
		||||
                return is_string($value);
 | 
			
		||||
            default:
 | 
			
		||||
                throw new \InvalidArgumentException(sprintf('Can not check for type %s.', $this->type));
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user