2014/10/14

Symfony2 (PHP Framework) 初學筆記(製作簡單的Restful API)

第一步、先安裝 Composer 後建立 Symfony2 Project


步驟可參考官網教學
[1] http://symfony.com/doc/current/quick_tour/the_big_picture.html

$ composer create-project symfony/framework-standard-edition myproject/ "~2.3"


第二步、建立新的 Bundle 作為我們的範例


*如果你有看 [1] 的話,就會大致上知道 Bundle 在專案裡是什麼角色。

可先閱讀一下這篇:
[2] http://symfony.com/doc/current/book/doctrine.html

這指令很重要所以記下來
$ php app/console generate:bundle --namespace=Acme/StoreBundle

然後依照 [2] 裡面的方法設定 & 建立 -> 資料庫 & Entity

其實 Symfony 底下是用 doctrine 這個 framework 做 ORM
$ php app/console doctrine:database:create

這個指令可以用互動式的方式產生 entity ,不過我還是喜歡自己手寫 PHP Annotation
$ php app/console doctrine:generate:entity

定義完 Entity 欄位後可以用下面指令直接產生 getter/setter

指定特定類別
$ php app/console doctrine:generate:entities Acme/StoreBundle/Entity/Product

或是指定整個 namespace
$ php app/console doctrine:generate:entities AcmeStoreBundle
$ php app/console doctrine:generate:entities Acme

步驟三、實際把 Entity 資訊更新到資料庫


$ php app/console doctrine:schema:update --force

步驟四、加入 Serialize 工具 (藉以產出 JSON / XML 等格式)


可先參考一下這篇文章:

安裝方法就是在 composer.json 加入 serialize 的 package 後 composer update

步驟五、寫 Controller 和設定 Router


use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\Serializer\Encoder\JsonEncoder;
use Symfony\Component\Serializer\Serializer;
use Symfony\Component\Serializer\Normalizer\GetSetMethodNormalizer;

 public function showAction($id)
 {
     $product = $this->getDoctrine()
         ->getRepository('AcmeStoreBundle:Product')
         ->find($id);

     if (!$product) {
         throw $this->createNotFoundException(
             'No product found for id '.$id
         );
     }

  $encoders = array(new JsonEncoder());
  $normalizers = array(new GetSetMethodNormalizer());

  $serializer = new Serializer($normalizers, $encoders);

  $jsonContent = $serializer->serialize($product, 'json');
  $response = new JsonResponse();
  $response->setContent($jsonContent);

  return $response;
 } 

acme_store_show_product:
    path:     /product/show/{id}
    defaults: { _controller: AcmeStoreBundle:Default:show }

No comments:

Post a Comment