소스 검색

webservices y controlador REST

Guillermo Espinoza 8 년 전
부모
커밋
3335d93233

+ 5 - 2
app/AppKernel.php

@@ -15,14 +15,17 @@ class AppKernel extends Kernel
             new Symfony\Bundle\SwiftmailerBundle\SwiftmailerBundle(),
             new Doctrine\Bundle\DoctrineBundle\DoctrineBundle(),
             new Sensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle(),
-
             new Sonata\CoreBundle\SonataCoreBundle(),
             new Sonata\BlockBundle\SonataBlockBundle(),
             new Knp\Bundle\MenuBundle\KnpMenuBundle(),
             new Sonata\DoctrineORMAdminBundle\SonataDoctrineORMAdminBundle(),
             new Sonata\AdminBundle\SonataAdminBundle(),
-
             new FTTHBundle\FTTHBundle(),
+            new WebserviceBundle\WebserviceBundle(),
+            new Voryx\RESTGeneratorBundle\VoryxRESTGeneratorBundle(),
+            new FOS\RestBundle\FOSRestBundle(),
+            new JMS\SerializerBundle\JMSSerializerBundle($this),
+            new Nelmio\CorsBundle\NelmioCorsBundle(),
         ];
 
         if (in_array($this->getEnvironment(), ['dev', 'test'], true)) {

+ 35 - 2
app/config/config.yml

@@ -3,6 +3,8 @@ imports:
     - { resource: security.yml }
     - { resource: services.yml }
     - { resource: "@FTTHBundle/Resources/config/services.yml" }
+    - { resource: "@WebserviceBundle/Resources/config/services.yml" }
+    - { resource: url_webservice.yml }
 
 # Put parameters here that don't need to change on each machine where the app is deployed
 # http://symfony.com/doc/current/best_practices/configuration.html#application-related-configuration
@@ -17,7 +19,7 @@ framework:
         resource: "%kernel.root_dir%/config/routing.yml"
         strict_requirements: ~
     form:            ~
-    csrf_protection: ~
+    csrf_protection: false #only use for public API
     validation:      { enable_annotations: true }
     #serializer:      { enable_annotations: true }
     templating:
@@ -74,4 +76,35 @@ sonata_block:
     default_contexts: [sonata_page_bundle]
     blocks:
         sonata.admin.block.admin_list:
-            contexts:   [admin]
+            contexts:   [admin]
+
+fos_rest:
+    routing_loader:
+        default_format: json
+    param_fetcher_listener: true
+    body_listener: true
+    #disable_csrf_role: ROLE_USER
+    body_converter:
+        enabled: true
+    view:
+        view_response_listener: force
+
+nelmio_cors:
+    defaults:
+        allow_credentials: false
+        allow_origin: []
+        allow_headers: []
+        allow_methods: []
+        expose_headers: []
+        max_age: 0
+    paths:
+        '^/api/':
+            allow_origin: ['*']
+            allow_headers: ['*']
+            allow_methods: ['POST', 'PUT', 'GET', 'DELETE']
+            max_age: 3600
+
+sensio_framework_extra:
+    request: { converters: true }
+    view:    { annotations: false }
+    router:  { annotations: true }            

+ 9 - 0
app/config/routing.yml

@@ -1,3 +1,12 @@
+ftth_onu_api:
+    resource: "@FTTHBundle/Controller/ONURESTController.php"
+    type:   rest
+    prefix:   /api
+
+webservice:
+    resource: "@WebserviceBundle/Resources/config/routing.yml"
+    prefix:   /
+
 ftth:
     resource: "@FTTHBundle/Resources/config/routing.yml"
     prefix:   /

+ 2 - 0
app/config/url_webservice.yml

@@ -0,0 +1,2 @@
+parameters:
+    client: 'http://200.50.175.17/base/app_dev.php/api/clients.json'

+ 2 - 1
composer.json

@@ -32,7 +32,8 @@
         "sonata-project/doctrine-orm-admin-bundle": "^3.1",
         "jms/serializer-bundle": "^1.1",
         "phpunit/phpunit": "5.5.*",
-        "stof/doctrine-extensions-bundle": "^1.2"
+        "stof/doctrine-extensions-bundle": "^1.2",
+        "voryx/restgeneratorbundle": "dev-master"
     },
     "require-dev": {
         "sensio/generator-bundle": "^3.0",

+ 312 - 31
composer.lock

@@ -4,8 +4,8 @@
         "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
         "This file is @generated automatically"
     ],
-    "hash": "5d1745df8d7542f0ee30b2fa49d6aba6",
-    "content-hash": "ee94f91dac139f29497aae8fc225f2d7",
+    "hash": "1725e827a2df18634794ed9c881d47bf",
+    "content-hash": "af36e5d568b3c12c256fd4c5e318fe18",
     "packages": [
         {
             "name": "behat/transliterator",
@@ -880,6 +880,92 @@
             ],
             "time": "2016-12-18 15:42:34"
         },
+        {
+            "name": "friendsofsymfony/rest-bundle",
+            "version": "1.7.7",
+            "target-dir": "FOS/RestBundle",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/FriendsOfSymfony/FOSRestBundle.git",
+                "reference": "c79b7e5df96e5581591ceb6a026bd4e5f9346de0"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/FriendsOfSymfony/FOSRestBundle/zipball/c79b7e5df96e5581591ceb6a026bd4e5f9346de0",
+                "reference": "c79b7e5df96e5581591ceb6a026bd4e5f9346de0",
+                "shasum": ""
+            },
+            "require": {
+                "doctrine/inflector": "~1.0",
+                "php": "^5.3.9|~7.0",
+                "psr/log": "~1.0",
+                "symfony/framework-bundle": "~2.3|~3.0",
+                "symfony/http-kernel": "^2.3.24|~3.0",
+                "willdurand/jsonp-callback-validator": "~1.0",
+                "willdurand/negotiation": "~1.2"
+            },
+            "conflict": {
+                "jms/serializer": "<0.12",
+                "jms/serializer-bundle": "<0.11",
+                "symfony/validator": ">=2.5.0,<2.5.5"
+            },
+            "require-dev": {
+                "jms/serializer": "~0.13|~1.0",
+                "jms/serializer-bundle": "~0.12|~1.0",
+                "phpoption/phpoption": "~1.1.0",
+                "sensio/framework-extra-bundle": "~2.0|~3.0",
+                "sllh/php-cs-fixer-styleci-bridge": "^1.3",
+                "symfony/browser-kit": "~2.3|~3.0",
+                "symfony/dependency-injection": "~2.3|~3.0",
+                "symfony/form": "~2.3|~3.0",
+                "symfony/phpunit-bridge": "~2.7|~3.0",
+                "symfony/security": "~2.3|~3.0",
+                "symfony/serializer": "~2.3|~3.0",
+                "symfony/validator": "~2.3|~3.0",
+                "symfony/yaml": "~2.3|~3.0"
+            },
+            "suggest": {
+                "jms/serializer-bundle": "Add support for advanced serialization capabilities, recommended, requires ~0.12||~1.0",
+                "sensio/framework-extra-bundle": "Add support for route annotations and the view response listener, requires ~3.0",
+                "symfony/serializer": "Add support for basic serialization capabilities and xml decoding, requires ~2.3",
+                "symfony/validator": "Add support for validation capabilities in the ParamFetcher, requires ~2.3"
+            },
+            "type": "symfony-bundle",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.7-dev"
+                }
+            },
+            "autoload": {
+                "psr-0": {
+                    "FOS\\RestBundle": ""
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Lukas Kahwe Smith",
+                    "email": "smith@pooteeweet.org"
+                },
+                {
+                    "name": "FriendsOfSymfony Community",
+                    "homepage": "https://github.com/friendsofsymfony/FOSRestBundle/contributors"
+                },
+                {
+                    "name": "Konstantin Kudryashov",
+                    "email": "ever.zet@gmail.com"
+                }
+            ],
+            "description": "This Bundle provides various tools to rapidly develop RESTful API's with Symfony",
+            "homepage": "http://friendsofsymfony.github.com",
+            "keywords": [
+                "rest"
+            ],
+            "time": "2015-12-29 16:02:50"
+        },
         {
             "name": "gedmo/doctrine-extensions",
             "version": "v2.4.26",
@@ -1534,6 +1620,63 @@
             ],
             "time": "2017-01-26 22:05:40"
         },
+        {
+            "name": "nelmio/cors-bundle",
+            "version": "1.5.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/nelmio/NelmioCorsBundle.git",
+                "reference": "cc9a26517b65769e6e3cea10099d4a40ce11ca29"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/nelmio/NelmioCorsBundle/zipball/cc9a26517b65769e6e3cea10099d4a40ce11ca29",
+                "reference": "cc9a26517b65769e6e3cea10099d4a40ce11ca29",
+                "shasum": ""
+            },
+            "require": {
+                "symfony/framework-bundle": "^2.7 || ^3.0"
+            },
+            "require-dev": {
+                "matthiasnoback/symfony-dependency-injection-test": "^0.7.6",
+                "mockery/mockery": "0.9.*"
+            },
+            "type": "symfony-bundle",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.5.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Nelmio\\CorsBundle\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nelmio",
+                    "homepage": "http://nelm.io"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://github.com/nelmio/NelmioCorsBundle/contributors"
+                }
+            ],
+            "description": "Adds CORS (Cross-Origin Resource Sharing) headers support in your Symfony2 application",
+            "keywords": [
+                "api",
+                "cors",
+                "crossdomain"
+            ],
+            "time": "2017-01-22 21:34:09"
+        },
         {
             "name": "paragonie/random_compat",
             "version": "v2.0.4",
@@ -3001,6 +3144,58 @@
             ],
             "time": "2017-02-02 15:31:23"
         },
+        {
+            "name": "sensio/generator-bundle",
+            "version": "v3.1.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sensiolabs/SensioGeneratorBundle.git",
+                "reference": "ec278c0bd530edf155c4a00900577b5cb80f559e"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sensiolabs/SensioGeneratorBundle/zipball/ec278c0bd530edf155c4a00900577b5cb80f559e",
+                "reference": "ec278c0bd530edf155c4a00900577b5cb80f559e",
+                "shasum": ""
+            },
+            "require": {
+                "symfony/console": "~2.7|~3.0",
+                "symfony/framework-bundle": "~2.7|~3.0",
+                "symfony/process": "~2.7|~3.0",
+                "symfony/yaml": "~2.7|~3.0",
+                "twig/twig": "^1.28.2|^2.0"
+            },
+            "require-dev": {
+                "doctrine/orm": "~2.4",
+                "symfony/doctrine-bridge": "~2.7|~3.0"
+            },
+            "type": "symfony-bundle",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.1.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Sensio\\Bundle\\GeneratorBundle\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                }
+            ],
+            "description": "This bundle generates code for you",
+            "time": "2016-12-05 16:01:19"
+        },
         {
             "name": "sensiolabs/security-checker",
             "version": "v4.0.0",
@@ -4390,6 +4585,53 @@
             ],
             "time": "2017-01-11 19:36:15"
         },
+        {
+            "name": "voryx/restgeneratorbundle",
+            "version": "dev-master",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/voryx/restgeneratorbundle.git",
+                "reference": "72b61d2188662da453d2e2a9cd625a60b6f3233b"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/voryx/restgeneratorbundle/zipball/72b61d2188662da453d2e2a9cd625a60b6f3233b",
+                "reference": "72b61d2188662da453d2e2a9cd625a60b6f3233b",
+                "shasum": ""
+            },
+            "require": {
+                "friendsofsymfony/rest-bundle": "~1.7",
+                "jms/serializer-bundle": "~1.1",
+                "nelmio/cors-bundle": "~1.4 ",
+                "php": ">=5.3.0",
+                "sensio/generator-bundle": "~3.0"
+            },
+            "type": "symfony-bundle",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "0.2-dev"
+                }
+            },
+            "autoload": {
+                "psr-0": {
+                    "Voryx\\RESTGeneratorBundle": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Matt Bonneau"
+                },
+                {
+                    "name": "David Dan"
+                }
+            ],
+            "description": "REST API Generator for Symfony 2",
+            "time": "2016-04-18 12:29:38"
+        },
         {
             "name": "webmozart/assert",
             "version": "1.2.0",
@@ -4439,47 +4681,74 @@
                 "validate"
             ],
             "time": "2016-11-23 20:04:58"
-        }
-    ],
-    "packages-dev": [
+        },
         {
-            "name": "sensio/generator-bundle",
-            "version": "v3.1.2",
+            "name": "willdurand/jsonp-callback-validator",
+            "version": "v1.1.0",
             "source": {
                 "type": "git",
-                "url": "https://github.com/sensiolabs/SensioGeneratorBundle.git",
-                "reference": "ec278c0bd530edf155c4a00900577b5cb80f559e"
+                "url": "https://github.com/willdurand/JsonpCallbackValidator.git",
+                "reference": "1a7d388bb521959e612ef50c5c7b1691b097e909"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sensiolabs/SensioGeneratorBundle/zipball/ec278c0bd530edf155c4a00900577b5cb80f559e",
-                "reference": "ec278c0bd530edf155c4a00900577b5cb80f559e",
+                "url": "https://api.github.com/repos/willdurand/JsonpCallbackValidator/zipball/1a7d388bb521959e612ef50c5c7b1691b097e909",
+                "reference": "1a7d388bb521959e612ef50c5c7b1691b097e909",
                 "shasum": ""
             },
             "require": {
-                "symfony/console": "~2.7|~3.0",
-                "symfony/framework-bundle": "~2.7|~3.0",
-                "symfony/process": "~2.7|~3.0",
-                "symfony/yaml": "~2.7|~3.0",
-                "twig/twig": "^1.28.2|^2.0"
+                "php": ">=5.3.0"
             },
             "require-dev": {
-                "doctrine/orm": "~2.4",
-                "symfony/doctrine-bridge": "~2.7|~3.0"
+                "phpunit/phpunit": "~3.7"
             },
-            "type": "symfony-bundle",
+            "type": "library",
+            "autoload": {
+                "psr-0": {
+                    "JsonpCallbackValidator": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "William Durand",
+                    "email": "william.durand1@gmail.com",
+                    "homepage": "http://www.willdurand.fr"
+                }
+            ],
+            "description": "JSONP callback validator.",
+            "time": "2014-01-20 22:35:06"
+        },
+        {
+            "name": "willdurand/negotiation",
+            "version": "1.5.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/willdurand/Negotiation.git",
+                "reference": "2a59f2376557303e3fa91465ab691abb82945edf"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/willdurand/Negotiation/zipball/2a59f2376557303e3fa91465ab691abb82945edf",
+                "reference": "2a59f2376557303e3fa91465ab691abb82945edf",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.0"
+            },
+            "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "3.1.x-dev"
+                    "dev-master": "1.5-dev"
                 }
             },
             "autoload": {
                 "psr-4": {
-                    "Sensio\\Bundle\\GeneratorBundle\\": ""
-                },
-                "exclude-from-classmap": [
-                    "/Tests/"
-                ]
+                    "Negotiation\\": "src/Negotiation"
+                }
             },
             "notification-url": "https://packagist.org/downloads/",
             "license": [
@@ -4487,13 +4756,23 @@
             ],
             "authors": [
                 {
-                    "name": "Fabien Potencier",
-                    "email": "fabien@symfony.com"
+                    "name": "William Durand",
+                    "email": "william.durand1@gmail.com"
                 }
             ],
-            "description": "This bundle generates code for you",
-            "time": "2016-12-05 16:01:19"
-        },
+            "description": "Content Negotiation tools for PHP provided as a standalone library.",
+            "homepage": "http://williamdurand.fr/Negotiation/",
+            "keywords": [
+                "accept",
+                "content",
+                "format",
+                "header",
+                "negotiation"
+            ],
+            "time": "2015-10-01 07:42:40"
+        }
+    ],
+    "packages-dev": [
         {
             "name": "symfony/phpunit-bridge",
             "version": "v3.2.3",
@@ -4556,7 +4835,9 @@
     ],
     "aliases": [],
     "minimum-stability": "stable",
-    "stability-flags": [],
+    "stability-flags": {
+        "voryx/restgeneratorbundle": 20
+    },
     "prefer-stable": false,
     "prefer-lowest": false,
     "platform": {

+ 3 - 1
src/FTTHBundle/Admin/ONUAdmin.php

@@ -61,7 +61,9 @@ class ONUAdmin extends AbstractAdmin
             ->add('mac')
             ->add('serialNumber')
             ->add('ponSerialNumber')
-            ->add('clientId')
+            ->add('clientId', 'choice', array(
+                'choices' => $this->configurationPool->getContainer()->get('webservice')->getChoices('client')
+            ))
         ;
     }
 

+ 165 - 0
src/FTTHBundle/Controller/ONURESTController.php

@@ -0,0 +1,165 @@
+<?php
+
+namespace FTTHBundle\Controller;
+
+use FTTHBundle\Entity\ONU;
+use FTTHBundle\Form\ONUType;
+
+use FOS\RestBundle\Controller\Annotations\QueryParam;
+use FOS\RestBundle\Controller\Annotations\RouteResource;
+use FOS\RestBundle\Controller\Annotations\View;
+use FOS\RestBundle\Request\ParamFetcherInterface;
+use FOS\RestBundle\Util\Codes;
+use FOS\RestBundle\View\View as FOSView;
+use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
+use Symfony\Bundle\FrameworkBundle\Controller\Controller;
+use Symfony\Component\Form\Form;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\Response;
+
+use Voryx\RESTGeneratorBundle\Controller\VoryxController;
+
+/**
+ * ONU controller.
+ * @RouteResource("ONU")
+ */
+class ONURESTController extends VoryxController
+{
+    /**
+     * Get a ONU entity
+     *
+     * @View(serializerEnableMaxDepthChecks=true)
+     *
+     * @return Response
+     *
+     */
+    public function getAction(ONU $entity)
+    {
+        return $entity;
+    }
+    /**
+     * Get all ONU entities.
+     *
+     * @View(serializerEnableMaxDepthChecks=true)
+     *
+     * @param ParamFetcherInterface $paramFetcher
+     *
+     * @return Response
+     *
+     * @QueryParam(name="offset", requirements="\d+", nullable=true, description="Offset from which to start listing notes.")
+     * @QueryParam(name="limit", requirements="\d+", default="20", description="How many notes to return.")
+     * @QueryParam(name="order_by", nullable=true, array=true, description="Order by fields. Must be an array ie. &order_by[name]=ASC&order_by[description]=DESC")
+     * @QueryParam(name="filters", nullable=true, array=true, description="Filter by fields. Must be an array ie. &filters[id]=3")
+     */
+    public function cgetAction(ParamFetcherInterface $paramFetcher)
+    {
+        try {
+            $offset = $paramFetcher->get('offset');
+            $limit = $paramFetcher->get('limit');
+            $order_by = $paramFetcher->get('order_by');
+            $filters = !is_null($paramFetcher->get('filters')) ? $paramFetcher->get('filters') : array();
+
+            $em = $this->getDoctrine()->getManager();
+            $entities = $em->getRepository('FTTHBundle:ONU')->findBy($filters, $order_by, $limit, $offset);
+            if ($entities) {
+                return $entities;
+            }
+
+            return FOSView::create('Not Found', Codes::HTTP_NO_CONTENT);
+        } catch (\Exception $e) {
+            return FOSView::create($e->getMessage(), Codes::HTTP_INTERNAL_SERVER_ERROR);
+        }
+    }
+    /**
+     * Create a ONU entity.
+     *
+     * @View(statusCode=201, serializerEnableMaxDepthChecks=true)
+     *
+     * @param Request $request
+     *
+     * @return Response
+     *
+     */
+    public function postAction(Request $request)
+    {
+        $entity = new ONU();
+        $form = $this->createForm(get_class(new ONUType()), $entity, array("method" => $request->getMethod()));
+        $this->removeExtraFields($request, $form);
+        $form->handleRequest($request);
+
+        if ($form->isValid()) {
+            $em = $this->getDoctrine()->getManager();
+            $em->persist($entity);
+            $em->flush();
+
+            return $entity;
+        }
+
+        return FOSView::create(array('errors' => $form->getErrors()), Codes::HTTP_INTERNAL_SERVER_ERROR);
+    }
+    /**
+     * Update a ONU entity.
+     *
+     * @View(serializerEnableMaxDepthChecks=true)
+     *
+     * @param Request $request
+     * @param $entity
+     *
+     * @return Response
+     */
+    public function putAction(Request $request, ONU $entity)
+    {
+        try {
+            $em = $this->getDoctrine()->getManager();
+            $request->setMethod('PATCH'); //Treat all PUTs as PATCH
+            $form = $this->createForm(get_class(new ONUType()), $entity, array("method" => $request->getMethod()));
+            $this->removeExtraFields($request, $form);
+            $form->handleRequest($request);
+            if ($form->isValid()) {
+                $em->flush();
+
+                return $entity;
+            }
+
+            return FOSView::create(array('errors' => $form->getErrors()), Codes::HTTP_INTERNAL_SERVER_ERROR);
+        } catch (\Exception $e) {
+            return FOSView::create($e->getMessage(), Codes::HTTP_INTERNAL_SERVER_ERROR);
+        }
+    }
+    /**
+     * Partial Update to a ONU entity.
+     *
+     * @View(serializerEnableMaxDepthChecks=true)
+     *
+     * @param Request $request
+     * @param $entity
+     *
+     * @return Response
+     */
+    public function patchAction(Request $request, ONU $entity)
+    {
+        return $this->putAction($request, $entity);
+    }
+    /**
+     * Delete a ONU entity.
+     *
+     * @View(statusCode=204)
+     *
+     * @param Request $request
+     * @param $entity
+     *
+     * @return Response
+     */
+    public function deleteAction(Request $request, ONU $entity)
+    {
+        try {
+            $em = $this->getDoctrine()->getManager();
+            $em->remove($entity);
+            $em->flush();
+
+            return null;
+        } catch (\Exception $e) {
+            return FOSView::create($e->getMessage(), Codes::HTTP_INTERNAL_SERVER_ERROR);
+        }
+    }
+}

+ 3 - 1
src/FTTHBundle/Entity/ONU.php

@@ -4,11 +4,12 @@ namespace FTTHBundle\Entity;
 
 use Doctrine\ORM\Mapping as ORM;
 use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
+use Symfony\Component\Validator\Constraints as Assert;
 
 /**
  * @ORM\Table
  * @ORM\Entity
- *  @UniqueEntity("ponSerialNumber")
+ * @UniqueEntity("ponSerialNumber")
  */
 class ONU
 {
@@ -25,6 +26,7 @@ class ONU
      * @var string
      *
      * @ORM\Column(type="string", length=15, nullable=true)
+     * @Assert\Ip
      */
     private $ip;
 

+ 38 - 0
src/FTTHBundle/Form/ONUType.php

@@ -0,0 +1,38 @@
+<?php
+
+namespace FTTHBundle\Form;
+
+use Symfony\Component\Form\AbstractType;
+use Symfony\Component\Form\FormBuilderInterface;
+use Symfony\Component\OptionsResolver\OptionsResolver;
+
+class ONUType extends AbstractType
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function buildForm(FormBuilderInterface $builder, array $options)
+    {
+        $builder->add('ip')->add('mac')->add('serialNumber')->add('ponSerialNumber')->add('clientId')        ;
+    }
+    
+    /**
+     * {@inheritdoc}
+     */
+    public function configureOptions(OptionsResolver $resolver)
+    {
+        $resolver->setDefaults(array(
+            'data_class' => 'FTTHBundle\Entity\ONU'
+        ));
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getBlockPrefix()
+    {
+        return 'ftthbundle_onu';
+    }
+
+
+}

+ 0 - 0
src/WebserviceBundle/Resources/config/routing.yml


+ 8 - 0
src/WebserviceBundle/Resources/config/services.yml

@@ -0,0 +1,8 @@
+services:
+   webservice:
+       class: WebserviceBundle\Services\Webservice
+       arguments: ["@service_container"]
+#   webservice.admin:
+#        class: WebserviceBundle\Services\Admin
+#        tags:
+#            - { name: kernel.event_listener, event: sonata.admin.event.configure.list, method: addChoices } 

+ 35 - 0
src/WebserviceBundle/Services/Webservice.php

@@ -0,0 +1,35 @@
+<?php
+
+namespace WebserviceBundle\Services;
+
+class Webservice
+{
+
+    protected $serviceContainer;
+
+    
+    public function __construct($serviceContainer)
+    {
+        $this->serviceContainer = $serviceContainer;
+    }
+
+    /**
+     * @param string $webservice
+     * @param array $params
+     * @return array
+     */
+    public function getChoices($webservice, $params = array())
+    {
+        $choices = array();
+        if ($this->serviceContainer->hasParameter($webservice)) {
+            $url = $this->serviceContainer->getParameter($webservice);
+            $objectsJson = json_decode(file_get_contents($url), true);
+            foreach ($objectsJson as $object) {
+                $choices[$object['name']] = $object['id'];
+            }
+        }
+
+        return $choices;
+    }
+
+}

+ 9 - 0
src/WebserviceBundle/WebserviceBundle.php

@@ -0,0 +1,9 @@
+<?php
+
+namespace WebserviceBundle;
+
+use Symfony\Component\HttpKernel\Bundle\Bundle;
+
+class WebserviceBundle extends Bundle
+{
+}