Symfony-작업 예
이 장에서는 완전한 MVC 기반을 만드는 방법을 배웁니다. BookStore ApplicationSymfony Framework에서. 다음은 단계입니다.
1 단계 : 프로젝트 생성
다음 명령을 사용하여 Symfony에서 "BookStore"라는 새 프로젝트를 생성 해 보겠습니다.
symfony new BookStore
2 단계 : 컨트롤러 및 경로 생성
“src / AppBundle / Controller”디렉토리에 BooksController를 만듭니다. 다음과 같이 정의됩니다.
BooksController.php
<?php
namespace AppBundle\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Response;
class BooksController {
/**
* @Route("/books/author")
*/
public function authorAction() {
return new Response('Book store application!');
}
}
이제 BooksController를 만들고 다음으로 작업을 렌더링하는 뷰를 만듭니다.
3 단계 :보기 만들기
“app / Resources / views /”디렉토리에“Books”라는 새 폴더를 만들어 보겠습니다. 폴더 안에 "author.html.twig"파일을 만들고 다음 변경 사항을 추가합니다.
author.html.twig
<h3> Simple book store application</h3>
이제 BooksController 클래스에서 뷰를 렌더링합니다. 다음과 같이 정의됩니다.
BooksController.php
<?php
namespace AppBundle\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Response;
class BooksController extends Controller {
/**
* @Route("/books/author")
*/
public function authorAction() {
return $this->render('books/author.html.twig');
}
}
지금까지 기본적인 BooksController를 만들고 결과가 렌더링됩니다. URL“http : // localhost : 8000 / books / author”를 사용하여 브라우저에서 결과를 확인할 수 있습니다.
4 단계 : 데이터베이스 구성
“app / config / parameters.yml”파일에서 데이터베이스를 구성합니다.
파일을 열고 다음 변경 사항을 추가하십시오.
parameter.yml
# This file is auto-generated during the composer install
parameters:
database_driver: pdo_mysql
database_host: localhost
database_port: 3306
database_name: booksdb
database_user: <database_username>
database_password: <database_password>
mailer_transport: smtp
mailer_host: 127.0.0.1
mailer_user: null
mailer_password: null
secret: 0ad4b6d0676f446900a4cb11d96cf0502029620d
doctrine:
dbal:
driver: pdo_mysql
host: '%database_host%'
dbname: '%database_name%'
user: '%database_user%'
password: '%database_password%'
charset: utf8mb4
이제 Doctrine은 "booksdb"데이터베이스에 연결할 수 있습니다.
5 단계 : 데이터베이스 생성
다음 명령을 실행하여 "booksdb"데이터베이스를 생성하십시오. 이 단계는 Doctrine에서 데이터베이스를 바인딩하는 데 사용됩니다.
php bin/console doctrine:database:create
명령을 실행하면 빈 "booksdb"데이터베이스가 자동으로 생성됩니다. 화면에서 다음과 같은 응답을 볼 수 있습니다.
다음 결과가 생성됩니다-
Created database `booksdb` for connection named default
6 단계 : 정보 매핑
“src / AppBundle / Entity”에있는 Entity 디렉토리 내에 Book 엔티티 클래스를 만듭니다.
주석을 사용하여 Book 클래스를 직접 전달할 수 있습니다. 다음과 같이 정의됩니다.
Book.php
파일에 다음 코드를 추가하십시오.
<?php
namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity
* @ORM\Table(name = "Books")
*/
class Book {
/**
* @ORM\Column(type = "integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy = "AUTO")
*/
private $id;
/**
* @ORM\Column(type = "string", length = 50)
*/
private $name; /** * @ORM\Column(type = "string", length = 50) */ private $author;
/**
* @ORM\Column(type = "decimal", scale = 2)
*/
private $price;
}
여기서 테이블 이름은 선택 사항입니다.
테이블 이름을 지정하지 않으면 엔티티 클래스의 이름에 따라 자동으로 결정됩니다.
7 단계 : 엔터티 바인딩
Doctrine은 간단한 엔티티 클래스를 생성합니다. 모든 엔티티를 구축하는 데 도움이됩니다.
다음 명령을 실행하여 엔티티를 생성하십시오.
php bin/console doctrine:generate:entities AppBundle/Entity/Book
그러면 다음 결과가 표시되고 엔티티가 업데이트됩니다.
Generating entity "AppBundle\Entity\Book”
> backing up Book.php to Book.php~
> generating AppBundle\Entity\Book
Book.php
<?php
namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity
* @ORM\Table(name = "Books")
*/
class Book {
/**
* @ORM\Column(type = "integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy = "AUTO")
*/
private $id;
/**
* @ORM\Column(type = "string", length = 50)
*/
private $name; /** * @ORM\Column(type = "string", length = 50) */ private $author;
/**
* @ORM\Column(type = "decimal", scale = 2)
*/
private $price; /** * Get id * * @return integer */ public function getId() { return $this->id;
}
/**
* Set name
*
* @param string $name * * @return Book */ public function setName($name) {
$this->name = $name;
return $this; } /** * Get name * * @return string */ public function getName() { return $this->name;
}
/**
* Set author
*
* @param string $author * * @return Book */ public function setAuthor($author) {
$this->author = $author;
return $this; } /** * Get author * * @return string */ public function getAuthor() { return $this->author;
}
/**
* Set price
*
* @param string $price * * @return Book */ public function setPrice($price) {
$this->price = $price;
return $this; } /** * Get price * * @return string */ public function getPrice() { return $this->price;
}
}
8 단계 : 매핑 유효성 검사
엔터티를 만든 후 다음 명령을 사용하여 매핑의 유효성을 검사해야합니다.
php bin/console doctrine:schema:validate
다음 결과가 생성됩니다-
[Mapping] OK - The mapping files are correct
[Database] FAIL - The database schema is not in sync with the current mapping file.
Books 테이블을 만들지 않았기 때문에 엔터티가 동기화되지 않았습니다. 다음 단계에서 Symfony 명령을 사용하여 Books 테이블을 생성하겠습니다.
9 단계 : 스키마 생성
Doctrine은 Book 엔티티에 필요한 모든 데이터베이스 테이블을 자동으로 생성 할 수 있습니다. 다음 명령을 사용하여 수행 할 수 있습니다.
php bin/console doctrine:schema:update --force
명령을 실행하면 다음과 같은 응답이 표시됩니다.
Updating database schema...
Database schema updated successfully! "1" query was executed
이제 다음 명령을 사용하여 스키마를 다시 확인합니다.
php bin/console doctrine:schema:validate
다음 결과가 생성됩니다-
[Mapping] OK - The mapping files are correct.
[Database] OK - The database schema is in sync with the mapping files.
10 단계 : Getter 및 Setter
Bind an Entity 섹션에서 볼 수 있듯이 다음 명령은 Book 클래스에 대한 모든 getter 및 setter를 생성합니다.
$ php bin/console doctrine:generate:entities AppBundle/Entity/Book
11 단계 : 데이터베이스에서 개체 가져 오기
책의 세부 정보를 표시 할 BooksController에 메서드를 만듭니다.
BooksController.php
/**
* @Route("/books/display", name="app_book_display")
*/
public function displayAction() {
$bk = $this->getDoctrine() ->getRepository('AppBundle:Book') ->findAll(); return $this->render('books/display.html.twig', array('data' => $bk));
}
12 단계 :보기 만들기
액션을 표시하는 뷰를 만들어 보겠습니다. 보기 디렉터리로 이동하여 "display.html.twig"파일을 만듭니다. 파일에 다음 변경 사항을 추가하십시오.
display.html.twig
{% extends 'base.html.twig' %}
{% block stylesheets %}
<style>
.table { border-collapse: collapse; }
.table th, td {
border-bottom: 1px solid #ddd;
width: 250px;
text-align: left;
align: left;
}
</style>
{% endblock %}
{% block body %}
<h2>Books database application!</h2>
<table class = "table">
<tr>
<th>Name</th>
<th>Author</th>
<th>Price</th>
</tr>
{% for x in data %}
<tr>
<td>{{ x.Name }}</td>
<td>{{ x.Author }}</td>
<td>{{ x.Price }}</td>
</tr>
{% endfor %}
</table>
{% endblock %}
브라우저에서 URL "http : // localhost : 8000 / books / display"를 요청하여 결과를 얻을 수 있습니다.
결과
13 단계 : 도서 양식 추가
책을 시스템에 추가하는 기능을 만들어 보겠습니다. 다음과 같이 BooksController에 새 페이지, newAction 메서드를 만듭니다.
// use section
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
// methods section
/**
* @Route("/books/new")
*/
public function newAction(Request $request) {
$stud = new StudentForm(); $form = $this->createFormBuilder($stud)
->add('name', TextType::class)
->add('author', TextType::class)
->add('price', TextType::class)
->add('save', SubmitType::class, array('label' => 'Submit'))
->getForm();
return $this->render('books/new.html.twig', array('form' => $form->createView(),));
}
14 단계 : 책 양식보기 만들기
새 작업을 가리키는보기를 만들어 보겠습니다. 보기 디렉토리로 이동하여 "new.html.twig"파일을 만듭니다. 파일에 다음 변경 사항을 추가하십시오.
{% extends 'base.html.twig' %}
{% block stylesheets %}
<style>
#simpleform {
width:600px;
border:2px solid grey;
padding:14px;
}
#simpleform label {
font-size:14px;
float:left;
width:300px;
text-align:right;
display:block;
}
#simpleform span {
font-size:11px;
color:grey;
width:100px;
text-align:right;
display:block;
}
#simpleform input {
border:1px solid grey;
font-family:verdana;
font-size:14px;
color:light blue;
height:24px;
width:250px;
margin: 0 0 10px 10px;
}
#simpleform textarea {
border:1px solid grey;
font-family:verdana;
font-size:14px;
color:light blue;
height:120px;
width:250px;
margin: 0 0 20px 10px;
}
#simpleform select {
margin: 0 0 20px 10px;
}
#simpleform button {
clear:both;
margin-left:250px;
background: grey;
color:#FFFFFF;
border:solid 1px #666666;
font-size:16px;
}
</style>
{% endblock %}
{% block body %}
<h3>Book details:</h3>
<div id = "simpleform">
{{ form_start(form) }}
{{ form_widget(form) }}
{{ form_end(form) }}
</div>
{% endblock %}
다음 화면이 출력으로 생성됩니다.
15 단계 : 도서 정보 수집 및 저장
newAction 메서드를 변경하고 양식 제출을 처리하는 코드를 포함 해 보겠습니다. 또한 도서 정보를 데이터베이스에 저장하십시오.
/**
* @Route("/books/new", name="app_book_new")
*/
public function newAction(Request $request) { $book = new Book();
$form = $this->createFormBuilder($book) ->add('name', TextType::class) ->add('author', TextType::class) ->add('price', TextType::class) ->add('save', SubmitType::class, array('label' => 'Submit')) ->getForm(); $form->handleRequest($request); if ($form->isSubmitted() && $form->isValid()) { $book = $form->getData(); $doct = $this->getDoctrine()->getManager(); // tells Doctrine you want to save the Product $doct->persist($book); //executes the queries (i.e. the INSERT query) $doct->flush();
return $this->redirectToRoute('app_book_display'); } else { return $this->render('books/new.html.twig', array(
'form' => $form->createView(),
));
}
}
책이 데이터베이스에 저장되면 책 표시 페이지로 리디렉션합니다.
16 단계 : 책 업데이트
책을 업데이트하려면 조치, updateAction을 작성하고 다음 변경 사항을 추가하십시오.
/**
* @Route("/books/update/{id}", name = "app_book_update" )
*/
public function updateAction($id, Request $request) { $doct = $this->getDoctrine()->getManager(); $bk = $doct->getRepository('AppBundle:Book')->find($id);
if (!$bk) { throw $this->createNotFoundException(
'No book found for id '.$id ); } $form = $this->createFormBuilder($bk)
->add('name', TextType::class)
->add('author', TextType::class)
->add('price', TextType::class)
->add('save', SubmitType::class, array('label' => 'Submit'))
->getForm();
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$book = $form->getData();
$doct = $this->getDoctrine()->getManager();
// tells Doctrine you want to save the Product
$doct->persist($book);
//executes the queries (i.e. the INSERT query)
$doct->flush(); return $this->redirectToRoute('app_book_display');
} else {
return $this->render('books/new.html.twig', array( 'form' => $form->createView(),
));
}
}
여기서는 두 가지 기능을 처리하고 있습니다. 요청에 id 만 포함 된 경우 데이터베이스에서 가져 와서 책 형식으로 표시합니다. 그리고 요청에 전체 도서 정보가 포함 된 경우 데이터베이스의 세부 정보를 업데이트하고 도서 표시 페이지로 리디렉션합니다.
17 단계 : 개체 삭제
객체를 삭제하려면 엔티티 (독트린) 관리자의 remove () 메서드를 호출해야합니다.
이것은 다음 코드를 사용하여 수행 할 수 있습니다.
/**
* @Route("/books/delete/{id}", name="app_book_delete")
*/
public function deleteAction($id) { $doct = $this->getDoctrine()->getManager(); $bk = $doct->getRepository('AppBundle:Book')->find($id);
if (!$bk) { throw $this->createNotFoundException('No book found for id '.$id); } $doct->remove($bk); $doct->flush();
return $this->redirectToRoute('app_book_display');
}
여기에서 책을 삭제하고 책 표시 페이지로 리디렉션했습니다.
18 단계 : 디스플레이 페이지에 추가 / 편집 / 삭제 기능 포함
이제 디스플레이보기에서 본문 블록을 업데이트하고 다음과 같이 추가 / 편집 / 삭제 링크를 포함합니다.
{% block body %}
<h2>Books database application!</h2>
<div>
<a href = "{{ path('app_book_new') }}">Add</a>
</div>
<table class = "table">
<tr>
<th>Name</th>
<th>Author</th>
<th>Price</th>
<th></th>
<th></th>
</tr>
{% for x in data %}
<tr>
<td>{{ x.Name }}</td>
<td>{{ x.Author }}</td>
<td>{{ x.Price }}</td>
<td><a href = "{{ path('app_book_update', { 'id' : x.Id }) }}">Edit</a></td>
<td><a href = "{{ path('app_book_delete', { 'id' : x.Id }) }}">Delete</a></td>
</tr>
{% endfor %}
</table>
{% endblock %}
다음 화면이 출력으로 생성됩니다.
Symfony는 일련의 PHP 구성 요소, 애플리케이션 프레임 워크, 커뮤니티 및 철학으로 구성됩니다. Symfony는 매우 유연하고 고급 사용자, 전문가의 모든 요구 사항을 충족 할 수 있으며 PHP를 사용하는 모든 초보자에게 이상적인 선택입니다.