수색…
나머지 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를 보호해야합니다!
미래의 사례가있을 수 있습니까?