如何解决在 null 上调用成员函数 factory() |代码点火器 | RESTAPI |主干.js
我正在构建一个使用 Codeigniter RESTAPI 和 Backbone.js 的 Wishlist 应用程序。 我收到以下错误。
A PHP Error was encountered
Severity: Notice
Message: Undefined property: ApiHandler::$format
Filename: libraries/REST_Controller.PHP
Line Number: 798
Backtrace:
File: C:\xampp\htdocs\2017464\WishList-App\application\libraries\REST_Controller.PHP
Line: 798
Function: _error_handler
File: C:\xampp\htdocs\2017464\WishList-App\application\libraries\REST_Controller.PHP
Line: 703
Function: response
File: C:\xampp\htdocs\2017464\WishList-App\index.PHP
Line: 315
Function: require_once
A PHP Error was encountered
Severity: Notice
Message: Undefined property: ApiHandler::$format
Filename: libraries/REST_Controller.PHP
Line Number: 816
Backtrace:
File: C:\xampp\htdocs\2017464\WishList-App\application\libraries\REST_Controller.PHP
Line: 816
Function: _error_handler
File: C:\xampp\htdocs\2017464\WishList-App\application\libraries\REST_Controller.PHP
Line: 703
Function: response
File: C:\xampp\htdocs\2017464\WishList-App\index.PHP
Line: 315
Function: require_once
An uncaught Exception was encountered
Type: Error
Message: Call to a member function factory() on null
Filename: C:\xampp\htdocs\2017464\WishList-App\application\libraries\REST_Controller.PHP
Line Number: 816
Backtrace:
File: C:\xampp\htdocs\2017464\WishList-App\application\libraries\REST_Controller.PHP
Line: 703
Function: response
File: C:\xampp\htdocs\2017464\WishList-App\index.PHP
Line: 315
Function: require_once
我在“api”文件夹中有我的 ApiHandler 控制器类,所有功能都在“ApiHandler”控制器中,我用来显示视图的路线如下,
http://localhost/2xxxxxx/WishList-App/index.PHP/user/register
这个网址应该是打开注册的,我在routes.PHP中设置的路由是
$route['user/register'] = 'api/ApiHandler/register';
<?PHP defined('BASEPATH') OR exit('No direct script access allowed');
use Restserver\Libraries\REST_Controller;
require APPPATH . '/libraries/REST_Controller.PHP';
require APPPATH . '/libraries/Format.PHP';
class ApiHandler extends Restserver\Libraries\REST_Controller
{
public function __construct()
{
parent::__construct();
//Load User Model
$this->load->model('User_model','usermodel');
$this->load->model('Item_model','Itemmodel');
}
/** User Registration
* -----------------------
* @param: fullname
* @param: username
* @param: email
* @param: password
* -----------------------
* @method: POST
* @link: api/user/register
*/
public function register_post(){
header("Access-Control-Allow-Origin: *");
$data = array("returned");
$this->response($data);
// XSS Filtering (https://www.codeigniter.com/user_guide/libraries/security.html)
$_POST = $this->security->xss_clean($_POST);
$this->form_validation->set_data([
'full_name'=>$this->post('full_name',TRUE),'username'=>$this->post('username','email'=>$this->post('email','password'=>$this->post('password','wishlist_name'=>$this->post('wishlist_name','wishlist_description'=>$this->post('wishlist_description',TRUE)
]);
//Form Validation
$this->form_validation->set_rules('full_name','Full Name','trim|required|maxlength[50');
$this->form_validation->set_rules('username','Username','trim|required|is_unique[users.username]|max_length[20]',array('is_unique'=>'This %s already exists please enter another username'));
$this->form_validation->set_rules('email','Email','trim|required|valid_email|max_length[80]',array('is_unique'=>'This %s already exists,please enter another email address.'));
$this->form_validation->set_rules('password','Password','trim|required|max_length[100]');
$this->form_validation->set_rules('wishlist_name','Wishlist Name','trim|required|max_length[100]');
$this->form_validation->set_rules('wishlist_description','Wishlist Description','trim|required|max_length[1000]');
if ($this->form_validation->run() == FALSE){
//Form Validation
$message = array(
'status'=>FALSE,'error'=>$this->form_validation->error_array(),'message'=>validation_errors()
);
$this->response($message,REST_Controller::HTTP_NOT_FOUND);
}else{
//inserting data
$insert_data = [
'full_name'=>$this->post('full_name','password'=>password_hash($this->post('password',TRUE)),TRUE)
];
//Insert the User into the Database
$output = $this->usermodel->insert_user($insert_data);
if ($output>0 AND !empty($output)){
//Send Success code 200
$message = [
'status'=>TRUE,'message'=>"User registration successful"
];
$this->response($message,REST_Controller::HTTP_OK);
}else{
//Error
$message = [
'status'=>FALSE,'message'=>"Account not registered"
];
$this->response($message,REST_Controller::HTTP_NOT_FOUND);
}
}
}
}
模型类
<?PHP
class User_Model extends CI_Model
{
protected $user_table = 'users';
/** User Registration
*@param:{array} User Data
*/
public function insert_user(array $data){
$this->db->insert($this->user_table,$data);
return $this->db->inset_id();
}
/** User Login
*--------------
*@param: username or email address
*@param: password
*/
public function user_login($username,$password){
$this->db->where('email',$username);
$this->db->or_where('username',$username);
$query = $this->db->get($this->user_table);
if ($query->num_rows()){
$user_pass = $query->row('password');
if(md5($password) === $user_pass){
return $query->row();
}
return FALSE;
}else{
return FALSE;
}
}
/** get user details
*@param: User ID
*/
public function viewUserDetails($user_ID){
$this->db->where('id',$user_ID);
$query = $this->db->get($this->user_table);
if($query->num_rows()>0){
foreach($query->result() as $row){
$data = $row;
}
return $data;
}
return false;
}
}
视图在下方
<!doctype html>
<html lang="en">
<head>
<Meta charset ="utf-8">
<title>WISH LIST</title>
<!--favicon-->
<link rel="icon" type="image/png" href="<?PHP echo base_url();?>assets/images/favicon.png">
<!--CSS -->
<link rel="stylesheet" href="<?PHP echo base_url();?>assets/css/font-awesome.min.css">
<link href="<?PHP echo base_url();?>assets/css/bootstrap.min.css" rel="stylesheet">
<link href="<?PHP echo base_url();?>assets/css/mdb.min.css" rel="stylesheet">
</head>
<body style="background-image: url('<?PHP echo base_url();?>assets/images/cover.png')">
<div class="container">
<!--Wish List-->
<hr>
<div class="newItem"></div>
<div class="page"></div>
</div>
<!-- Javascript dependencies and Libraries-->
<script src="<?PHP echo base_url();?>assets/js/jquery.min.js" type="text/javascript"></script>
<script src="<?PHP echo base_url();?>assets/js/underscore-min.js" type="text/javascript"></script>
<script src="<?PHP echo base_url();?>assets/js/backbone-min.js"></script>
<script src="<?PHP echo base_url();?>assets/js/sweetalert.min.js"></script>
<script type="text/javascript" src="<?PHP echo base_url();?>assets/js/bootstrap.min.js"></script>
<script type="text/javascript" src="<?PHP echo base_url();?>assets/js/mdb.min.js"></script>
<!--Load the backbone models-->
<script src="<?PHP echo base_url();?>assets/scripts/models/usermodel.js"></script>
<script src="<?PHP echo base_url();?>assets/scripts/models/Itemmodel.js"></script>
<!--load the backbone collections-->
<script src="<?PHP echo base_url();?>assets/scripts/collections/WishlistCollection.js"></script>
<!--load the backbone views-->
<script src="<?PHP echo base_url();?>assets/scripts/views/LoginView.js"></script>
<script src="<?PHP echo base_url();?>asserts/scripts/views/SignupView.js"></script>
<script src="<?PHP echo base_url();?>assets/scripts/views/WishListView.js"></script>
<script src="<?PHP echo base_url();?>assets/scripts/views/ShareListView.js"></script>
<!--template for the user signup view-->
<script type="text/template" id="user-signup-template">
<div class="container-fluid">
<div style='justify-content: center;' class="row">
<div style="padding-top: 5%;
padding-bottom: 8%;" class="col-lg-8 col-md-10">
<!--Form without header-->
<div style="padding: 90px 20% 90px 20%" class="card">
<div class="card-block">
<!--Header-->
<div class="text-center">
<h3><i class="fa fa-users"></i> Create NEW Account:</h3>
<hr class="mt-2 mb-2">
</div>
<!--Body-->
<form class="user-signup-form">
<div style='text-align: center; color: red;' class='error_msg'></div>
<div class="md-form">
<i class="fa fa-user prefix"></i>
<input type="text" name="full_name" required id="form1" class="form-control">
<label for="form1">Full Name:</label>
</div>
<div class="md-form">
<i class="fa fa-at prefix"></i>
<input type="email" name="email" required id="form2" class="form-control">
<label for="form2">E-mail:</label>
</div>
<div class="md-form">
<i class="fa fa-user-circle prefix"></i>
<input type="text" name="username" required id="form3" class="form-control">
<label for="form3">username:</label>
</div>
<div class="md-form">
<i class="fa fa-lock prefix"></i>
<input type="password" name="password" required id="form4" class="form-control">
<label for="form4">password:</label>
</div>
<div class="md-form">
<i class="fa fa-th-list prefix"></i>
<input type="text" name="wishlist_name" required id="form5" class="form-control">
<label for="form5">Wish LIst Name:</label>
</div>
<div class="md-form">
<i class="fa fa-info-circle prefix"></i>
<input type="text" name="wishlist_description" required id="form6" class="form-control">
<label for="form6">Description</label>
</div>
<div class="text-center">
<button type="submit" style="background:#20c997" id="signup-btn" class="btn btn-deep signupbtn">SIGNUP</button>
</div>
</div>
already user? <a href="#/">Login</a>
</div>
</form>
<!--/Form without header-->
</div>
</div>
</div>
</script>
<script>
//fo edit wishist row
var maxWishlist = 99999;
//handle custom ajax call
$.ajaxPrefilter(function (options,originalOptions,jqXHR) {
options.url = 'http://localhost/2017464/WishList-App/api' + options.url;
});
//create object from form element
function htmlEncode(value) {
return $('<div/>').text(value).html();
}
$.fn.serializeObject = function () {
var o = {};
var a = this.serializeArray();
$.each(a,function () {
if (o[this.name] !== undefined) {
if (!o[this.name].push) {
o[this.name] = [o[this.name]];
}
o[this.name].push(this.value || '');
} else {
o[this.name] = this.value || '';
}
});
return o;
};
//define backbone routes
var Router = Backbone.Router.extend({
routes: {
"": "login","signup": "signup","wishlist/:id": "wishlist","sharelist/:id": "sharelist"
}
});
//create instance of router
var router = new Router;
router.on('route:wishlist',function (id) {
// render item list
wishListView.fetchData({
id: id
});
})
router.on('route:login',function () {
loginView.render();
})
router.on('route:signup',function () {
signupView.render();
})
router.on('route:sharelist',function (id) {
sharelistView.render({
id: atob(id) //decrypt share link user id
});
})
//start record routes
Backbone.history.start();
</script>
</body>
</html>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。