使用CodeIgniter和AngularJS的API REST(开始工作;删除,保存和更新不起作用)

时间:2015-06-28 10:40:29

标签: angularjs codeigniter rest

我正在根据此视频构建一个带有CodeIgniter 3和AngularJS的API REST。该视频采用西班牙语,但它是一种很棒的素材:https://www.youtube.com/watch?v=SjXpVJi6pHY

我无法弄清楚为什么我能从数据库中检索书籍(我们正在制作的书籍数据库)。但是我无法删除,编辑或添加它们。

目前只关注删除一本书:

如果我点击列表中的第一本书,我会得到:

DELETE http://localhost/codeigniter/restangularjs/books/1 400 (Bad Request)

如果我点击列表中的第二本书,我会得到同样的错误,最后只有数字2

因此系统知道要调用哪个控制器,甚至传递给书的正确ID(第一本书的编号为1,第二本书编号为2)。

下面我附上了删除图书所需的所有相关文件。我不知道从哪里开始,并希望得到一些指导。

我觉得奇怪的是,在名为Book(app.js中唯一的工厂)的工厂中,我们只定义update(在EditCtrl中使用)。但我们不会定义save(在CreateCtrl中使用),deleteget(都在HomeCtrl中使用)。

另一方面,在我看来,因为我们正在处理REST_Controller(Books.php不是CI_Controller,而是REST_Controller)update可以用于所有调用(所以不仅仅是为了更新,但也用于保存,删除和获取)。

我更倾向于将该选项作为Books.get函数(在HomeCtrl中)......

Books.get(function(data){
    $scope.books = data.response;
});

...是唯一正常工作的功能,即使工厂内没有get调用。

但我不知道。我真的不知道。这是我的第一个API REST。

我的树(在xampp / htdocs上只包含相关的文件夹和文件):

codeigniter
--restangularjs
----application
------controllers
--------Books.php
------models
--------Books_model.php
angularjs
--ciangularrest
----src
------index.html
------app.js
------components
--------list.html

CodeIgniter - 从Books.php(控制器)中提取

<?php
defined('BASEPATH') OR exit('No direct script access allowed');

require APPPATH . "/libraries/REST_Controller.php";

class Books extends REST_Controller 
{
    public function __construct() 
    {
        // Ne vem, če je spodnjo vrstico header('Access-Control-Allow-Origin: *'); varno pisati - fora je v tem, da z zvezdico daš dostop vsem. Preveri.
        header('Access-Control-Allow-Origin: *');
        header("Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept, Access-Control-Request-Method");
        header("Access-Control-Allow-Methods: GET, POST, OPTIONS, PUT, DELETE");
        $method = $_SERVER['REQUEST_METHOD'];
        if($method == "OPTIONS") {
            die();
        }
        parent::__construct();
        $this->load->model('books_model');
    }

    public function index_get()
    {
        $books = $this->books_model->get();

        if( ! is_null($books))
        {
            $this->response(array("response" => $books), 200);
        } else
        {
            $this->response(array("error" => "No books available"), 404);
        }
    }

    // Other functions here but not relevant for my post on StackOverflow

    public function index_delete()
    {
        if( ! $id)
        {
            $this->response(NULL, 400);
        }

        $delete = $this->books_model->delete($id);

        if( ! is_null($delete))
        {
            $this->response(array("response" => "Book deleted"), 200);
        } else
        {
            $this->response(array("error" => "There was an error"), 400);
        }
    }

}

CodeIgniter - 从User_model.php中提取

<?php
defined('BASEPATH') OR exit('No direct script access allowed');

class Books_model extends CI_Model {

    public function __construct()
    {
       parent::__construct();
    }

    public function get($id = NULL)
    {
        if( ! is_null($id))
        {
            $query = $this->db->select("*")->from("books")->where("id", $id)->get();
            if($query->num_rows() === 1)
            {
                return $query->row_array();
            }
            return NULL;
        }

        $query = $this->db->select("*")->from("books")->get();
        if($query->num_rows() > 0)
        {
            return $query->result_array();
        }
        return NULL;
    }

    public function delete($id)
    {
        $this->db->where("id",$id)->delete("books");

        if($this->db->affected_rows() === 1)
        {
            return TRUE;
        }
        return NULL;
    }

}

AngularJS - 从app.js中提取

.controller('HomeCtrl', ['$scope', 'Books', '$route', function ($scope, Books, $route) {

    Books.get(function(data)
    {
        $scope.books = data.response;
    });

    $scope.remove = function(id)
    {
        console.log("inside remove function; " + "deleting the book with id=" + id);

        Books.delete({id:id}).$promise.then(function(data)
        {
            if(data.response)
            {
                $route.reload();
            }
        })

    }

}])

.factory('Books', ["$resource", function($resource){

    return $resource(
        "http://localhost/codeigniter/restangularjs/books/:id", 
        {id:"@_id"}, 
        {update: {method: "PUT", params: {id: "@_id"}}}
    )

}])

AngularJS - 从list.html中提取

<a ng-click="remove(book.id)">Delete</a>

0 个答案:

没有答案