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');
}