我正在根据此视频构建一个带有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中使用),delete
或get
(都在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>