7

## CRUD PHP >= 5.4

create retrieve read update delete post get put routing

Create, Retrieve, Update and Delete using HTTP methods POST, GET, PUT and DELETE respectively.

Restler uses get, put, post, and delete as prefix to map PHP methods to respective HTTP methods. When they are the only method names they map at the class level similar to index

> Note:-

> 1. Read the Routes example for better understanding.
> 2. When we want the entire data that is sent to the API, we need to use `$request_data` as the name of the parameter any other name will only get partial data under the specified key
> 3. This example favours simplicity over best practices. Documentation and Rate Limiting examples continue improving from where we left off here. It is highly recommended to check them out.

For simplicity and making it work out of the box this example is using a session based fake database, thus depending on a client that supports PHP Session Cookies. You may use REST Console an extension for Chrome or RESTClient a firefox extension.

Alternatively you can use cURL on the command line.

    curl -X POST http://restler3.luracast.com/examples/_007_crud/index.php/authors -H "Content-Type: application/json" -d '{"name": "Another", "email": "another@email.com"}'

    {
      "name": "Another",
      "email": "another@email.com",
      "id": 5
    }

But since the session wont be working, next request wont reflect the change done by previous request, anyway you get the idea. You may use any of the following files instead of Session.php to get full functionality.

> - MySQLDataProvider.php (helper)
> - SqliteDataProvider.php (helper)
> - SerializedFileDataProvider.php (helper)

by un-commenting the respective line in Authors.php and commenting others.

> This API Server is made using the following php files/folders

> - index.php (gateway)
> - Authors.php (api)
> - SessionDataProvider.php (helper)
> - restler.php (framework)
> - JsonFormat.php (format)

This API Server exposes the following URIs

    GET    authors      ⇠ Authors::index()
    POST   authors      ⇠ Authors::post()
    GET    authors/{id} ⇠ Authors::get()
    PUT    authors/{id} ⇠ Authors::put()
    DELETE authors/{id} ⇠ Authors::delete()

Try the following links in your browser

GET authors

      [
        {
          "id": 1,
          "name": "Jac Wright",
          "email": "jacwright@gmail.com"
        },
        {
          "id": 2,
          "name": "Arul Kumaran",
          "email": "arul@luracast.com"
        }
      ]

GET authors/2

      {
        "id": 2,
        "name": "Arul Kumaran",
        "email": "arul@luracast.com"
      }

### Creating new Author

Typical post request to create a new author will be any of the following

Using query parameters

    POST /examples/_007_crud/index.php/authors?name=Another&email=another@email.com HTTP/1.1
    Host: restler3.dev
    Content-Length: 0
    Accept-Language: en
    X-Requested-With: XMLHttpRequest
    User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.112 Safari/535.1
    Content-Type: application/x-www-form-urlencoded; charset=UTF-8
    Accept: /*
    Accept-Encoding: gzip,deflate,sdch
    Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
    Cookie: PHPSESSID=dcdfec433e86c1a6730f75303187071f

Using post vars

    POST /examples/_007_crud/index.php/authors HTTP/1.1
    Host: restler3.dev
    Content-Length: 36
    Accept-Language: en
    X-Requested-With: XMLHttpRequest
    User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.112 Safari/535.1
    Content-Type: application/x-www-form-urlencoded; charset=UTF-8
    Accept: /*
    Accept-Encoding: gzip,deflate,sdch
    Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
    Cookie: PHPSESSID=dcdfec433e86c1a6730f75303187071f

    name=Another&email=another@email.com

Using JSON data

    POST /examples/_007_crud/index.php/authors HTTP/1.1
    Host: restler3.dev
    Content-Length: 46
    Origin: chrome-extension://faceofpmfclkengnkgkgjkcibdbhemoc
    Accept-Language: en
    X-Requested-With: XMLHttpRequest
    User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.112 Safari/535.1
    Content-Type: application/json; charset=UTF-8
    Accept: /*
    Accept-Encoding: gzip,deflate,sdch
    Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
    Cookie: PHPSESSID=dcdfec433e86c1a6730f75303187071f

    {"name":"Another","email":"another@email.com"}

and the response for all the above could be

    HTTP/1.1 200 OK
    Date: Tue, 25 Sep 2012 10:05:06 GMT
    Server: Apache/2.2.19 (Unix) mod_ssl/2.2.19 OpenSSL/0.9.8r DAV/2 PHP/5.3.6 with Suhosin-Patch
    X-Powered-By: Luracast Restler v3.0.0
    Expires: 0
    Cache-Control: no-cache, must-revalidate
    Pragma: no-cache
    Content-Length: 66
    Content-Type: application/json

    {
      "name": "Another",
      "email": "another@email.com",
      "id": 7
    }

We expect the following behaviour from this example.

    @example7 @crud
    Feature: Testing CRUD Example

      Scenario: Creating new Author by POSTing vars
        Given that I want to make a new "Author"
        And his "name" is "Chris"
        And his "email" is "chris@world.com"
        When I request "examples/_007_crud/authors"
        Then the response status code should be 200
        And the response should be JSON
        And the response has a "id" property

      Scenario: Creating new Author with JSON
        Given that I want to make a new "Author"
        And his "name" is "Chris"
        And his "email" is "chris@world.com"
        And the request is sent as JSON
        When I request "examples/_007_crud/authors"
        Then the response status code should be 200
        And the response should be JSON
        And the response has a "id" property

      Scenario: Updating Author with JSON
        Given that I want to update "Author"
        And his "name" is "Jac"
        And his "email" is "jac@wright.com"
        And his "id" is 1
        And the request is sent as JSON
        When I request "examples/_007_crud/authors/{id}"
        Then the response status code should be 200
        And the response should be JSON
        And the response has a "id" property

      Scenario: Given url is valid for other http method(s)
        Given that I want to update "Author"
        And his "name" is "Jac"
        And his "email" is "jac@wright.com"
        And his "id" is 1
        And the request is sent as JSON
        When I request "examples/_007_crud/authors"
        Then the response status code should be 405
        And the response "Allow" header should be "GET, POST"

      Scenario: Deleting Author
        Given that I want to delete an "Author"
        And his "id" is 1
        When I request "examples/_007_crud/authors/{id}"
        Then the response status code should be 200
        And the response should be JSON
        And the response has an "id" property

It can be tested by running the following command on terminal/command line from the project root (where the vendor folder resides). Make sure `base_url` in `behat.yml` is updated according to your web server.

    vendor/bin/behat  features/examples/_007_crud.feature