在 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';

这是我的 ApiHandler 控制器,具有用户注册功能

<?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> &nbsp;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 (将#修改为@)