【问题标题】:issues with backbone.js DELETE request and codeigniter restserver (phils)主干.js DELETE 请求和 codeigniter restserver (phils) 的问题
【发布时间】:2011-11-03 05:47:28
【问题描述】:

我确定这是我做错了,但我似乎无法弄清楚。我正在使用backbone.js 与我的休息服务器(Philip Sturgeon 的codeigniter restserver)交谈。我在我的一个主干集合模型上运行一个普通的 model.destroy() 。

//a basic example
tagCollection.at(5).destroy();

这会创建一个对 url 的正确调用,例如:

删除http://mydomain.com/index.php/tags/tag/id/12

当我进入我的“tag_delete”php 函数时,执行以下操作:

$this->delete('id');

这总是什么都不返回。我认为这与backbone.js 发送它的请求的方式有关,但没有什么能引起我的注意。详情如下。

Backbone 正在发出“DELETE”请求。

我的 REST_Controller 方法中的相关代码:

function tag_delete () {
    //delete the tag
    $id = $this->delete('id'); //always empty

    $result = $this->tag_model->delete($id);

    if (! $result) {
        $this->response(array('status' => 'failed'), 400);  
    }

    $this->response(array('status' => 'success'), 200);
}

有什么想法吗?任何backbone.js 专家在使用codeigniter 和Philip Sturgeon 的restserver 时都会遇到这种情况?

【问题讨论】:

    标签: codeigniter rest backbone.js


    【解决方案1】:

    这应该是修复删除请求的一种廉价快速的方法...

    function tag_delete () {
    
         $id = $this->uri->segment(4);
    
         $result = $this->tag_model->delete($id);
    
         if (! $result) {
              $this->response(array('status' => 'failed'), 400);  
         }
    
         $this->response(array('status' => 'success'), 200);
    }
    

    但是,这就是我使用骨干网和 REST_Controller 组合构建请求的方式...

    删除http://example.com/index.php/tags/12

    (去掉网址的 /tag/id/ 段...这意味着您正在按 id 从“tags”集合中删除一个“tag”行,不需要附加 /tag/id)

    function tag_delete ($id) {
    
         $result = $this->tag_model->delete($id);
    
         if (! $result) {
              $this->response(array('status' => 'failed'), 400);  
         }
    
         $this->response(array('status' => 'success'), 200);
    }
    

    对于收藏:

    Backbone.Collection.extend({
        url : '/tags'
    });
    
    tagCollection.at(5).destroy();
    

    然后将这样的内容添加到您的路线中:

    $route['tags/(:num)'] = 'tags/tag/$1';
    

    这将为 restserver 控制器设置必要的结构...如果您正在做大量的 Backbone 工作,那么这种方式更易于管理。

    【讨论】:

    • 我喜欢那个 tgriesser!谢谢你的提示。我是使用restful codeigniter的新手,这对我来说很有意义。今天午餐时,我正在为此研究一个解决方案并想出了这个:我重载了 $this->delete 与:function delete ($var) { $uri_array = $this->uri->uri_to_assoc(3); return $uri_array[$var]; } 所以我仍然可以使用 $this->delete('id') 并让它返回我的预期的。也就是说,我们基本上在做同样的事情。感谢您花时间查看!
    • 没问题 - 同样,与原始问题无关,但是如果您开始遇到会话随机过期的问题,并且您的应用程序非常 ajax/rest 很重,请查看此线程关于如何解决它。 - 如果您遇到同样的问题,希望它能为您节省一点时间。 codeigniter.com/forums/viewthread/138823/P15/#913493
    • 所以,奇怪的是,这件事今天才开始发生在我身上,我想,“我知道有人在某个时候提到过这个”,并在那里找到了你的评论。感谢您提及!
    【解决方案2】:

    根据 tgriesser 的建议,最好的方法是使用集合上的 url 属性。我之前使用过以下内容,它的工作原理很迷人(以下控制器使用 silex 框架 + paris 库实现数据访问):

    // DELETE   /{resource}/{id}    Destroy
    $app->delete('/api/todos/{id}', function ($id) use ($app) {
        $todo =  $app['paris']->getModel('Todo')->find_one($id);
        $todo->delete(); 
    
        return new Response('Todo deleted', 200);
    });
    

    在您的主干集合中,添加以下内容:

    window.TodoList = Backbone.Collection.extend({
        model: Todo,
    
        url: "api/todos",
    
        ...
    });
    

    最近,我写了一篇关于如何使用 Backbone.js 和 PHP http://cambridgesoftware.co.uk/blog/item/59-backbonejs-%20-php-with-silex-microframework-%20-mysql 进行 GET/POST/PUT/DELETE 的教程,可能会有所帮助。

    【讨论】:

      猜你喜欢
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-18
      • 1970-01-01
      相关资源
      最近更新 更多