Suche…


Rest-API

Ich habe auf dieser Site bereits eine Dokumentation geschrieben, um zu beschreiben, wie Webservices auf Symfony erstellt werden können

Ich werde noch einmal ein Tutorial für die Version Symfony> = 3 schreiben.

Wir denken, dass auf einer konfigurierten Version von Symfony Framework ein Webserver installiert ist. Sie müssen Composer (PHP-Paketmanager) installiert haben.

Um es einfach zu machen, wenn Sie Composer installiert haben, geben Sie Folgendes in eine Terminal- / Eingabeaufforderung ein:

composer create-project symfony/framework-standard-edition example "3.1.*"

Dadurch wird im aktuellen Verzeichnis ein neues Verzeichnis mit dem Namen "example" erstellt, und zwar mit einer Standardinstallation von Symfony Framework.

Sie müssen diese 2 Bundles installieren: JMSSerializer Bundle (erweitert Framework Framework Serializer) und FOSRest Bundle (erweitert Framework Routing und Controller ...)

Dies können Sie folgendermaßen tun (im Beispielverzeichnis):

composer require jms/serializer-bundle "~0.13"
composer require friendsofsymfony/rest-bundle

Vergiss nicht, sie in AppKernel zu aktivieren!

Hier können Sie nicht verwenden:

composer create-project gimler/symfony-rest-edition --stability=dev example

Weil es auf der Version von Symfony 2.8 basiert.

Erstellen Sie zunächst Ihr eigenes ("Beispiel") Bundle (im Symfony-Verzeichnis):

php bin/console generate:bundle
php bin/console doctrine:create:database

Stellen Sie sich vor, wir möchten CRUD (Erstellen / Lesen / Aktualisieren / Löschen) dieser StackOverFlower-Entität erstellen:

# src/ExampleBundle/Resources/config/doctrine/StackOverFlower.orm.yml
ExampleBundle\Entity\StackOverFlower:
    type: entity
    table: stackoverflower
    id:
        id:
            type: integer
            generator: { strategy: AUTO }
    fields:
        name:
            type: string
            length: 100

Konfigurieren Sie Ihr Bundle:

#app/config/config.yml
fos_rest:
    format_listener:
        rules:
            - { path: '^/stackoverflower', priorities: ['xml', 'json'], fallback_format: xml, prefer_extension: true }
            - { path: '^/', priorities: [ 'text/html', '*/*'], fallback_format: html, prefer_extension: true }

Generieren Sie diese Entität:

php bin/console doctrine:generate:entity StackOverFlower
php bin/console doctrine:schema:update --force

Machen Sie einen Controller:

#src/ExampleBundle/Controller/StackOverFlowerController.php

namespace ExampleBundle\Controller;

use FOS\RestBundle\Controller\FOSRestController;
use Symfony\Component\HttpFoundation\Request;

use FOS\RestBundle\Controller\Annotations\Get;
use FOS\RestBundle\Controller\Annotations\Post;
use FOS\RestBundle\Controller\Annotations\Delete;

use ExampleBundle\Entity\StackOverFlower;

class StackOverFlowerController extends FOSRestController
{
    /**
     * findStackOverFlowerByRequest
     * 
     * @param Request $request
     * @return StackOverFlower
     * @throws NotFoundException
     */
    private function findStackOverFlowerByRequest(Request $request) {
        
        $id = $request->get('id');
        $user = $this->getDoctrine()->getManager()->getRepository("ExampleBundle:StackOverFlower")->findOneBy(array('id' => $id));
        
        return $user;
    }
    
    /**
     * validateAndPersistEntity
     * 
     * @param StackOverFlower $user
     * @param Boolean $delete
     * @return View the view
     */
    private function validateAndPersistEntity(StackOverFlower $user, $delete = false) {
        
        $template = "ExampleBundle:StackOverFlower:example.html.twig";
        
        $validator = $this->get('validator');
        $errors_list = $validator->validate($user); 
        
        if (0 === count($errors_list)) {
            
            $em = $this->getDoctrine()->getManager();
            
            if ($delete === true) {
                $em->remove($user);
            } else {
                $em->persist($user);
            }
            
            $em->flush();
            
            $view = $this->view($user)
                         ->setTemplateVar('user')
                         ->setTemplate($template);
        } else {
            
            $errors = "";
            foreach ($errors_list as $error) {
                $errors .= (string) $error->getMessage();  
            }
            
            $view = $this->view($errors)
                         ->setTemplateVar('errors')
                         ->setTemplate($template);
            
        } 
        
        return $view;
    }
    
    /**
     * newStackOverFlowerAction
     * 
     * @Get("/stackoverflower/new/{name}")
     * 
     * @param Request $request
     * @return String
     */
    public function newStackOverFlowerAction(Request $request)
    {   
        $user = new StackOverFlower();
        $user->setName($request->get('name'));
        
        $view = $this->validateAndPersistEntity($user);
            
        return $this->handleView($view);
    }
      
    /**
     * editStackOverFlowerAction
     * 
     * @Get("/stackoverflower/edit/{id}/{name}")
     * 
     * @param Request $request
     * @return type
     */
    public function editStackOverFlowerAction(Request $request) {
        
        $user = $this->findStackOverFlowerByRequest($request);
        
        if (! $user) {
            $view = $this->view("No StackOverFlower found for this id:". $request->get('id'), 404);
            return $this->handleView($view);
        }
        
        $user->setName($request->get('name'));
        
        $view = $this->validateAndPersistEntity($user);
                
        return $this->handleView($view);
    }
    
    /**
     * deleteStackOverFlowerAction
     * 
     * @Get("/stackoverflower/delete/{id}")
     * 
     * @param Request $request
     * @return type
     */
    public function deleteStackOverFlowerAction(Request $request) {
        
        $user = $this->findStackOverFlowerByRequest($request);
        
        if (! $user) {
            $view = $this->view("No StackOverFlower found for this id:". $request->get('id'), 404);
            return $this->handleView();
        }
        
        $view = $this->validateAndPersistEntity($user, true);
                
        return $this->handleView($view);
    }
    
    /**
     * getStackOverFlowerAction
     * 
     * @Get("/stackoverflowers")
     * 
     * @param Request $request
     * @return type
     */
    public function getStackOverFlowerAction(Request $request) {
        
        $template = "ExampleBundle:StackOverFlower:example.html.twig";
        
        $users = $this->getDoctrine()->getManager()->getRepository("ExampleBundle:StackOverFlower")->findAll();
        
        if (0 === count($users)) {
            $view = $this->view("No StackOverFlower found.", 404);
            return $this->handleView();
        }
        
        $view = $this->view($users)
                     ->setTemplateVar('users')
                     ->setTemplate($template);
        
        return $this->handleView($view);
    }
}

Sag mir nicht, das ist ein Fat-Controller, es ist für das Beispiel !!!

Erstellen Sie Ihre Vorlage:

#src/ExampleBundle/Resources/views/StackOverFlower.html.twig
{% if errors is defined %}
  {{ errors }}  
{% else %}
  {% if users is defined %}
    {{ users | serialize }}
  {% else %}
    {{ user | serialize }}
  {% endif %}
{% endif %}

Sie haben gerade Ihre erste RESTFul-API erstellt !!!

Sie können es unter folgender Adresse testen: http: //Ihr-Servername/Ihr-Symfony-Pfad/app_dev.php/stackoverflower/new/test .

Wie Sie in der Datenbank sehen können, wurde ein neuer Benutzer mit dem Namen "test" erstellt.

Ein voll funktionsfähiges Beispiel für diesen Code finden Sie in meinem GitHub-Konto , einem Zweig mit mehr echten Routen ...

Dies ist ein sehr einfaches Beispiel. Lassen Sie das in Produktionsumgebungen nicht zu, Sie müssen Ihre API mit einem Apikey schützen !!!

Ein zukünftiges Beispiel kann sein?



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow