खोज…


बाकी एपीआई

सिम्फनी पर वेब सेवाएं कैसे बनाई जाए, इसका वर्णन करने के लिए मैंने इस साइट पर पहले से लिखित दस्तावेज दिया है

मैं फिर से सिम्फनी> = 3 संस्करण के लिए एक ट्यूटोरियल लिखूंगा।

हमें लगता है कि हमारे पास सिम्फनी फ्रेमवर्क के कॉन्फ़िगर किए गए संस्करण पर एक स्थापित वेब-सर्वर है। आपके पास संगीतकार (php संकुल प्रबंधक) भी स्थापित होना चाहिए।

इसे सरल बनाने के लिए, यदि आपके पास कंपोज़र स्थापित है, तो इसे टर्मिनल / कमांड प्रॉम्प्ट में टाइप करें:

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

यह मौजूदा निर्देशिका में "उदाहरण" नामक एक नई निर्देशिका बनाएगा, जिसमें सिम्फनी फ्रेमवर्क की एक मानक स्थापना होगी।

आपको यह 2 बंडल स्थापित करना होगा: JMSSialializer बंडल (फ्रेमवर्क कंपोनेंट serializer का विस्तार करता है) और FOSRest बंडल (फ्रेमवर्क राउटिंग और कंट्रोलर का विस्तार ...)

आप इसे इस तरह कर सकते हैं (उदाहरण निर्देशिका में):

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

AppKernel में उन्हें सक्रिय करने के लिए मत भूलना!

यहाँ आप उपयोग नहीं कर सकते हैं:

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

क्योंकि यह सिम्फनी 2.8 वर्जन पर आधारित है।

सबसे पहले, अपना खुद का ("उदाहरण") बंडल बनाएं (सिम्फनी निर्देशिका में):

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

कल्पना करें कि हम इस StackOverFlower इकाई का CRUD (क्रिएट / रीड / अपडेट / डिलीट) करना चाहते हैं:

# 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

अपने बंडल को कॉन्फ़िगर करें:

#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 }

इस इकाई को उत्पन्न करें:

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

एक नियंत्रक बनाएं:

#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);
    }
}

मुझे मत बताओ कि यह वसा नियंत्रक है, यह उदाहरण के लिए है !!!

अपना टेम्प्लेट बनाएं:

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

आपने अभी अपना पहला RESTFul API बनाया है !!!

आप इस पर परीक्षण कर सकते हैं: http: //your-server-name/your-symfony-path/app_dev.php/stackoverflower/new/test

जैसा कि आप डेटाबेस में देख सकते हैं, नाम के साथ एक नया उपयोगकर्ता बनाया गया है: "परीक्षण"।

आप मेरे GitHub खाते पर इस कोड का एक पूर्ण कार्य करने का उदाहरण देख सकते हैं, और अधिक वास्तविक मार्गों के साथ एक शाखा ...

यह एक बहुत ही बुनियादी उदाहरण है, उत्पादन environnement में ऐसा नहीं करते हैं, आप अपने api apikey के साथ की रक्षा करना चाहिए !!!

एक भविष्य का उदाहरण, हो सकता है?



Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow