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?