官术网_书友最值得收藏!

Parsing extensions

It's common for applications to use a file extension as part of the URL. This can sometimes help orientate the user to the type of content found in that location or for your application to easily deal with data types such as JSON or XML.

In this recipe, we'll look at how easy it is to parse extensions using the framework.

Getting ready

For this recipe, we'll use a books controller from previous chapter, which will return a listing of books from the books database table as a JSON response. So, find a file named BooksController.php in app/Controller/.

How to do it...

Perform the following steps:

  1. First, add the following line to your routes.php file located in app/Config/:
    Router::parseExtensions('json');
  2. Then, we'll load the RequestHandler component in our BooksController class using the following code:
    public $components = array('RequestHandler');
  3. We'll also add a listing() method with the following code:
    public function listing() {
      $books = $this->Book->find('all', array('fields' => array('name', 'stock')));
      $this->set(array(
        'books' => Hash::extract($books, '{n}.Book'),
        '_serialize' => array('books')
      ));
    }
  4. Now, navigating to /books/listing.json in your browser will return a JSON listing of books similar to the following code:
    {'books':[{'title':'1984','author':'George Orwell'},{'title':'Neuromancer','author':'William Gibson'},{'title':'The Cuckoo\'s Egg','author':'Cliff Stoll'}]}
    {
      "books": [
        {
          "name": "CakePHP Application",
          "stock": "2"
        },
        {
          "name": "PHP for Beginners",
          "stock": "3"
        },
        {
          "name": "Server Administration",
          "stock": "0"
        }
      ]
    }

How it works...

We first added a call to the static parseExtensions() method of the Router class. This method allows you to easily define extensions, which will be detected and handled automatically by the framework. By default, CakePHP provides both XML and JSON out of the box, but you can define any extension you like. You can also define multiple extensions by simply specifying the different extensions in the method call. An example can be seen in the following code:

Router::parseExtensions('xml', 'json');

Next, we included the RequestHandler component in our BooksController class, as this handles the internal logic to process the extension routing. You must include this component in any controller where you want extensions to be parsed correctly.

We then created a listing() action in our controller, which serves a list of books from the database for our JSON format. Here you'll notice our use of a _serialize key in our call to set(). This is a special view variable that defines other view variables to be serialized for use in data views. The value of _serialize can be a string, as the name of another view variable, or an array of various view variables to use. All variables defined for _serialize must also be defined using the set() method in the controller.

Internally, with the json extension defined to be parsed with Router::parseExtensions(), on every request with a .json URL extension or with the Accept header set to application/json, the framework will switch the standard view class for JsonView. This then handles the correct encoding and display of the JSON format.

See also

主站蜘蛛池模板: 来宾市| 仁怀市| 贺兰县| 沽源县| 聂荣县| 山阴县| 菏泽市| 新兴县| 景东| 泗水县| 乌兰县| 客服| 绥化市| 万宁市| 玛多县| 武义县| 嘉禾县| 得荣县| 呼图壁县| 建宁县| 苍山县| 义马市| 双牌县| 涿州市| 和顺县| 府谷县| 湟中县| 小金县| 翁源县| 砚山县| 茶陵县| 华阴市| 兰坪| 古交市| 石景山区| 佛坪县| 绥芬河市| 神池县| 天门市| 玉林市| 楚雄市|