我是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) ;
}
}
答案 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
$persons = $this->personRepo->getPaginate($this->nbrPerPage);
,而不是__construct()
。_construct
$this->$person = $person ;
中移除$
。应该是:$this->$person