在非对象上调用成员函数getPaginate()

时间:2016-01-04 17:08:46

标签: php laravel laravel-5 phpstorm

我是laravel框架的新手,我正在编写我的第一个网络应用程序

并收到以下错误

 FatalErrorException in PersonController.php line 26:
Call to a member function getPaginate() on a non-object

这是我的控制器

   <?php

namespace App\Http\Controllers; 
use App\Repositories\PersonRepository;

class PersonController extends Controller
{
    protected  $personRepo ;
    protected  $nbrPerPage = 4 ;


    public  function  _construct(PersonRepository $personRepository)
    {
        $this->personRepo = $personRepository ;
    }
    public function index()
    {
        $persons = $this->personRepo->getPaginate(nbrPerPage);
        $links = $persons->setPath('')->render();

        return view('index', compact('persons', 'links'));
    }

    public function create()
    {

    }


    public function store()
    {

    }


    public function show($id)
    {
        //
    }


    public function edit($id)
    {
        //
    }


    public function update($id)
    {
        //
    }


    public function destroy($id)
    {
        //
    }


}

这是我的存储库类

<?php
namespace  App\Repositories ;
use App\Person ;
use App\User;


class PersonRepository {

  protected  $person ;
    public function  _construct (Person $person)
    {
        $this->$person = $person  ;
    }


    public  function  getPaginate($n)
    {

        return $this->person-> paginate($n) ;
    }


 }

2 个答案:

答案 0 :(得分:3)

您正在实例化Person模型的空实例,然后尝试在您的存储库中调用paginate()。但是,paginate()应在查询构建器对象或Eloquent查询上调用。假设您想要返回 all 模型的分页结果,您可以完全废弃$person属性以及构造函数,然后只需将方法更改为:

public  function  getPaginate($n)
{
    return Person::paginate($n) ;
}

我会说,对于这样一个简单的查询,我建议不要完全使用存储库,只需在控制器中使用Person::paginate($n),因为Eloquent本质上已经充当了存储库。

答案 1 :(得分:2)

除非这些只是问题中的拼写错误,否则您的代码中会出现很多拼写错误。

导致此特定错误的拼写错误是构造函数方法的名称应为ja(带有两个下划线),而不是__construct(带有一个下划线)。

由于构造函数方法在_construct上拼写错误,因此永远不会调用此方法,并且永远不会设置PersonController属性。由于永远不会设置,因此行personRepo正在尝试在非对象上调用$persons = $this->personRepo->getPaginate(nbrPerPage);

我一眼就看出了其他错别字/问题:

  • getPaginate()
    $persons = $this->personRepo->getPaginate(nbrPerPage);被用作常量。这是不正确的。应该是:
    nbrPerPage
  • PersonRepository上的构造函数也拼写错误。应该是$persons = $this->personRepo->getPaginate($this->nbrPerPage);,而不是__construct()
  • _construct
    这是在PersonRepository的尝试构造内部。需要从$this->$person = $person ;中移除$。应该是:
    $this->$person