Php Laravel 5.4-生成视图登录错误
我正试图用这种方式为我的站点做一个控制器Php Laravel 5.4-生成视图登录错误,php,laravel,Php,Laravel,我正试图用这种方式为我的站点做一个控制器 class MyController extends BaseController { public function login() { $this->layout->testata = View::make('OUT'); $this->layout->content = View::make('auth.login'); } 但拉威尔说“试图分配非对象的属性”。 有什么问题吗 Basecontrol
class MyController extends BaseController {
public function login()
{
$this->layout->testata = View::make('OUT');
$this->layout->content = View::make('auth.login');
}
但拉威尔说“试图分配非对象的属性”。
有什么问题吗
Basecontroller只有构造函数
class BaseController extends Controller {
public $layout = 'a.main';
protected function setupLayout()
{
if ( ! is_null($this->layout))
{
$this->layout = View::make($this->layout);
}
}
}
问题出在哪里?在BaseController中,您有一个名为
$layout
的属性,它的默认值是a.main
,它是一个字符串
在MyController
类的login
方法中,您正在设置testata
和content
属性$layout
属性。但是,$layout
属性持有什么?它包含一个字符串a.main
。该字符串不是既没有testata
属性也没有content
属性的对象。这就是为什么会出现这个错误
现在,您可以声明正在为BaseController
的setupLayout
方法中的对象设置$layout
属性。但问题是,何时调用setupLayout
?没有迹象表明$layout
属性包含任何没有初始默认值a.main
的对象
作为快速修复,您可以在BaseController
的构造函数中调用setupLayout
方法,以便在启动BaseController
时设置$layout
属性。如下所示:
class BaseController extends Controller {
public $layout = 'a.main';
public function __construct(){
parent::__construct();
$this->setupLayout();
}
protected function setupLayout()
{
if ( ! is_null($this->layout))
{
$this->layout = View::make($this->layout);
}
}
}
此外,要解决此问题,您应该将初始化$layout
变量添加到对象stdClass(PHP的标准类)
,以便$layout
属性不再是非对象。然后您可以设置测试数据
和内容
$this->layout = new \stdClass; //or new stdClass();
$this->layout->testata = View::make('OUT');
$this->layout->content = View::make('auth.login');
调用类时,会指定一些值。
调用BaseController
时,将创建名为$layout
的属性
在BaseController
中,默认的$layout
属性值等于a.main
,它是一个字符串。
在这个类中,您使用的MyController
的登录方法使用的是$layout
,因为它是一个对象,在调用登录函数时为他提供了一些属性,如testata
和content
$this->layout->testata = View::make('OUT');
$this->layout->content = View::make('auth.login');
因此,正如Imran所说,更好、最简单的方法是使用命令\uu construct()
创建构造函数,并将以下代码添加到BaseController
中:
public function __construct(){
parent::__construct();
$this->setupLayout();
}
这将调用父构造函数,并在设置为upp时初始化BaseController
因此,您的BaseController
的完整PHP代码将是:
所以您必须使用stdClass
创建一个空对象,这是PHP中的空类,用于将其他类型强制转换为对象
下面是MyController的完整PHP代码:
你好。祝你好运您的类没有分配布局,因此当您尝试设置属性时,它们不存在。创建您自己的setupLayout函数,或者从BaseController而不是Controller继承。$layout
在BaseController中定义为字符串,但在登录函数中被称为对象。此外,由于MyController不扩展BaseController,$layout
在MyController中甚至不可用。我在复制粘贴时出错。类MyController扩展了BaseController{但不适用于sameThank you,但如果我添加函数uu construct()我也有同样的问题,谢谢你的反馈。答案已编辑。请查看并让我知道。找不到类'App\Http\Controllers\stdClass'$this->layout=new\stdClass;
名称空间不是很有趣吗?正如@ChrisForrence所说,在stdClass'之前添加一个`在PHP
根命名空间中。
class BaseController extends Controller {
public $layout = 'a.main';
public function __construct(){
parent::__construct();
$this->setupLayout();
}
protected function setupLayout()
{
if ( ! is_null($this->layout))
{
$this->layout = View::make($this->layout);
}
}
}
class MyController extends BaseController {
public function login()
{
$this->layout = new stdClass();
$this->layout->testata = View::make('OUT');
$this->layout->content = View::make('auth.login');
}