수색…


나머지 API

Symfony에서 웹 서비스를 만드는 방법을 설명하기 위해이 사이트에서 문서 를 작성했습니다.

symfony> = 3 버전에 대한 튜토리얼을 다시 작성하겠습니다.

우리는 Symfony Framework 의 구성된 버전에 설치된 웹 서버가 있다고 생각합니다. 작곡가 (PHP 패키지 관리자)도 설치되어 있어야합니다.

간단하게 만들려면, 작곡가를 설치했다면 이것을 터미널 / 명령 프롬프트에 입력하십시오 :

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

이렇게하면 symfony 프레임 워크의 표준 설치와 함께 현재 디렉토리에 "example"이라는 새 디렉토리가 만들어집니다.

이 2 번들 : JMSSerializer 번들 (프레임 워크 구성 요소 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

그것은 Symfony 2.8 버전을 기반으로하기 때문입니다.

먼저 자신 만의 "예제"번들을 만듭니다 (Symfony 디렉토리에 있음).

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

이 StackOverFlower Entity의 CRUD (Create / Read / Update / Delete)를 만들고 싶다고 상상 해보자.

# 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 에서 테스트 할 수 있습니다.

데이터베이스에서 볼 수 있듯이 "test"라는 이름으로 새 사용자가 생성되었습니다.

이 코드의 전체 작동 예제를 내 실제 GitHub 계정 ( 실제 경로가있는 지점)에서 볼 수 있습니다.

이것은 매우 기본적인 예입니다. 프로덕션 환경에서 그렇게하지 마십시오. apikey로 API를 보호해야합니다!

미래의 사례가있을 수 있습니까?



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow