CakePHP 3创建XML视图

时间:2016-01-30 13:11:50

标签: xml cakephp cakephp-3.0

我需要将数组转换为XML响应。目标是在插件控制器中编写一个函数并调用它,这将返回一个XML响应。

我一直在尝试使用CakePHP手册中提到的以下代码。

   namespace App\Controller;

   class ArticlesController extends AppController{

       public function initialize(){
            parent::initialize();
            $this->loadComponent('RequestHandler');
       }

       public function index(){

            // Set the view vars that have to be serialized.
            $this->set('articles', $this->paginate());
            // Specify which view vars JsonView should serialize.
            $this->set('_serialize', ['articles']);
       }
    }

有没有办法可以调试或修改响应,看看XML响应的确切程度如何?

2 个答案:

答案 0 :(得分:2)

在routes.php中

,插入

Router::extensions('xml');

之前

Router::defaultRouteClass('DashedRoute');

然后,在你的行动中使用“.xml”:

/yourController/index.xml

答案 1 :(得分:0)

我是cakePhp的新手,并使用cackephp 3(v 3.5)。在我的情况下只是添加 Router::extensions('xml');

到routes.php没有帮助。 我使用了更复杂的解决方案,但它运行正常。 在我的SitemapController控制器(/src/controller/SitemapController.php)中:

namespace App\Controller;

use Cake\Routing\Router;

class SitemapController extends AppController 
{
    public function initialize()
    {
        parent::initialize();

        // Set the response Content-Type to xml for each action
        $this->response->type(['xml' => 'application/xml']);       
        $this->response = $this->response->withType('xml');        
        // set layout 
        $this->viewBuilder()->setLayout('ajax');                
    } 

    /**
     * Shows index sitemap, which contains all the site's sitemaps (like pages)
     */
    public function index()
    {
        // ... some code here

        // just set the view vars to show in XML
        $this->set('baseUrl', Router::url('', true));
    }
// ... other code here
}

我已将响应类型设置为XML并设置cacke的ajax布局 - /src/Template/Layout/ajax.ctp(它只包含echo运算符):

echo $this->fetch('content');

在我的routes.php文件中

// sitemap index
Router::scope(
    '/sitemap.xml',
    ['controller' => 'Sitemap'],
    function ($routes) {
        $routes->connect(
            '/', 
            ['action' => 'index']
        );              
    }
);

几乎与json类型的内容一样。