尝试分配非对象的 属性 - Laravel 5.2
Attempt to assign property of non-object - Laravel 5.2
问题: 将我的 Laravel 4 代码转换为 Laravel 5.2。我正在移动和转换我的观点,无法克服以下错误。
错误: IndexController.php 第 27 行中的错误异常:
尝试分配 属性 of non-object
调试信息:
- 在IndexController.php第27行
- 在 HandleExceptions->handleError('2', 'Attempt to assign property of non-object', 'C:\Apache24\B2B_Contracts\app\Http\Controllers\IndexController.php', '27', array('numberofpcs' => object(additionalPCs), 'addtpcs' => array('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11 ', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', '30', '31', '32', '33', '34', '35', '36 ', '37', '38', '39', '40', '41', '42', '43', '44', '45', '46', '47', '48', '49', '50', '51', '52', '53', '54', '55', '56', '57', '58', '59', '60', '61 ', '62', '63', '64', '65', '66', '67', '68', '69', '70', '71', '72', '73', '74', '75', '76', '77', '78', '79', '80', '81', '82', '83', '84', '85', '86 ', '87', '88', '89', '90', '91', '92', '93', '94', '95', '96', '97', '98', '99', '100'))) IndexController.php 第 27 行
- 在 IndexController->index()
请求:请协助找出错误出现的原因,如果可能的话,请详细解释如何防止错误以及我做错了什么。
注意: 我曾经在 Laravel 4 上收到类似的错误,但我能够刷新迁移并重新设置数据库和所有内容会重新开始工作。这不适用于 Laravel 5 中的此错误。此代码适用于 L4。
尝试: 我已经阅读了很多关于 Google 的文章并尝试了各种项目,例如 php artisan clear-compiled 、composer dump-autoload、php artisan optimize 无济于事。我相信错误来自 $numberofpcs = new additionalPCs();但是我无法证实这一点。我还删除了我发送到视图的所有变量,错误仍然存在所以它看起来像 $this->layout->content = View::make('index');
IndexController.php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Library\additionalPCs;
use App\Http\Requests;
use App\Http\Controllers\Controller;
use View;
use App\Models\businesstype;
use App\Models\contractterm;
class IndexController extends BaseController
{
Protected $layout = 'master';
/**
* Display a listing of the resource.
*
* @return Response
*/
public function index()
{
/** Wayne - 03-02-2014 - Moved for loop to a method within its own class. */
$numberofpcs = new additionalPCs();
$addtpcs=$numberofpcs->display();
$this->layout->content = View::make('index')->with('addtpcs', $addtpcs)->with('businesstypelist', businesstype::dropdown())->with('contracttermlist',ContractTerm::dropdown());
}
}
additionalPCs.php
<?php
namespace App\Library;
use App\Library\additionalComputer;
class additionalPCs extends additionalComputer {
public function display() {
return $this->displayMenu();
}
}
additionalComputer.php
<?php
namespace App\Library;
/** Counts up the Number of Additional PC Options
* and stores them into an array then sends them to the view.
*/
class additionalComputer {
protected function displayMenu() {
$addtpcs= [];
for ($i=0; $i <= 100; $i++) {
$addtpcs[$i] = $i;
}
return $addtpcs;
}
}
BaseController.php - (这只是为了表明我确实有一个用于 IndexController 的 BaseController.php 文件。我'我知道默认情况下 L5 没有。)
<?php
namespace App\Http\Controllers;
class BaseController extends Controller {
/**
* Setup the layout used by the controller.
*
* @return void
*/
protected function setupLayout()
{
if ( ! is_null($this->layout))
{
$this->layout = View::make($this->layout);
}
}
}
控制器布局功能已在 Laravel 5 中删除。因此,setupLayout()
方法不会被调用,这意味着您的 layout
属性 将保留为字符串 'master'。因为它只是一个字符串,所以当您执行 $this->layout->content = ...
时,您试图分配一个 non-object.
的 属性
我相信如果您愿意,应该可以将其添加回去。在您的 BaseController
中,您需要将 callAction
方法重写为以前的方式:
public function callAction($method, $parameters)
{
$this->setupLayout();
$response = call_user_func_array(array($this, $method), $parameters);
// If no response is returned from the controller action and a layout is being
// used we will assume we want to just return the layout view as any nested
// views were probably bound on this view during this controller actions.
if (is_null($response) && ! is_null($this->layout)) {
$response = $this->layout;
}
return $response;
}
Patricus 帮助我找到了这个答案,但我想 post 这是因为在我尝试时提供的答案仍然有问题。但是他是对的,因为我不能再使用控制器布局了。
我变了
$this->layout->content = View::make('index')->with('addtpcs', $addtpcs)->with('businesstypelist', businesstype::dropdown())->with('contracttermlist',ContractTerm::dropdown());
至
return view('index')->with('addtpcs', $addtpcs)->with('businesstypelist', businesstype::dropdown())->with('contracttermlist',ContractTerm::dropdown());
这解决了那个问题。
问题: 将我的 Laravel 4 代码转换为 Laravel 5.2。我正在移动和转换我的观点,无法克服以下错误。
错误: IndexController.php 第 27 行中的错误异常: 尝试分配 属性 of non-object
调试信息:
- 在IndexController.php第27行
- 在 HandleExceptions->handleError('2', 'Attempt to assign property of non-object', 'C:\Apache24\B2B_Contracts\app\Http\Controllers\IndexController.php', '27', array('numberofpcs' => object(additionalPCs), 'addtpcs' => array('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11 ', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', '30', '31', '32', '33', '34', '35', '36 ', '37', '38', '39', '40', '41', '42', '43', '44', '45', '46', '47', '48', '49', '50', '51', '52', '53', '54', '55', '56', '57', '58', '59', '60', '61 ', '62', '63', '64', '65', '66', '67', '68', '69', '70', '71', '72', '73', '74', '75', '76', '77', '78', '79', '80', '81', '82', '83', '84', '85', '86 ', '87', '88', '89', '90', '91', '92', '93', '94', '95', '96', '97', '98', '99', '100'))) IndexController.php 第 27 行
- 在 IndexController->index()
请求:请协助找出错误出现的原因,如果可能的话,请详细解释如何防止错误以及我做错了什么。
注意: 我曾经在 Laravel 4 上收到类似的错误,但我能够刷新迁移并重新设置数据库和所有内容会重新开始工作。这不适用于 Laravel 5 中的此错误。此代码适用于 L4。
尝试: 我已经阅读了很多关于 Google 的文章并尝试了各种项目,例如 php artisan clear-compiled 、composer dump-autoload、php artisan optimize 无济于事。我相信错误来自 $numberofpcs = new additionalPCs();但是我无法证实这一点。我还删除了我发送到视图的所有变量,错误仍然存在所以它看起来像 $this->layout->content = View::make('index');
IndexController.php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Library\additionalPCs;
use App\Http\Requests;
use App\Http\Controllers\Controller;
use View;
use App\Models\businesstype;
use App\Models\contractterm;
class IndexController extends BaseController
{
Protected $layout = 'master';
/**
* Display a listing of the resource.
*
* @return Response
*/
public function index()
{
/** Wayne - 03-02-2014 - Moved for loop to a method within its own class. */
$numberofpcs = new additionalPCs();
$addtpcs=$numberofpcs->display();
$this->layout->content = View::make('index')->with('addtpcs', $addtpcs)->with('businesstypelist', businesstype::dropdown())->with('contracttermlist',ContractTerm::dropdown());
}
}
additionalPCs.php
<?php
namespace App\Library;
use App\Library\additionalComputer;
class additionalPCs extends additionalComputer {
public function display() {
return $this->displayMenu();
}
}
additionalComputer.php
<?php
namespace App\Library;
/** Counts up the Number of Additional PC Options
* and stores them into an array then sends them to the view.
*/
class additionalComputer {
protected function displayMenu() {
$addtpcs= [];
for ($i=0; $i <= 100; $i++) {
$addtpcs[$i] = $i;
}
return $addtpcs;
}
}
BaseController.php - (这只是为了表明我确实有一个用于 IndexController 的 BaseController.php 文件。我'我知道默认情况下 L5 没有。)
<?php
namespace App\Http\Controllers;
class BaseController extends Controller {
/**
* Setup the layout used by the controller.
*
* @return void
*/
protected function setupLayout()
{
if ( ! is_null($this->layout))
{
$this->layout = View::make($this->layout);
}
}
}
控制器布局功能已在 Laravel 5 中删除。因此,setupLayout()
方法不会被调用,这意味着您的 layout
属性 将保留为字符串 'master'。因为它只是一个字符串,所以当您执行 $this->layout->content = ...
时,您试图分配一个 non-object.
我相信如果您愿意,应该可以将其添加回去。在您的 BaseController
中,您需要将 callAction
方法重写为以前的方式:
public function callAction($method, $parameters)
{
$this->setupLayout();
$response = call_user_func_array(array($this, $method), $parameters);
// If no response is returned from the controller action and a layout is being
// used we will assume we want to just return the layout view as any nested
// views were probably bound on this view during this controller actions.
if (is_null($response) && ! is_null($this->layout)) {
$response = $this->layout;
}
return $response;
}
Patricus 帮助我找到了这个答案,但我想 post 这是因为在我尝试时提供的答案仍然有问题。但是他是对的,因为我不能再使用控制器布局了。
我变了
$this->layout->content = View::make('index')->with('addtpcs', $addtpcs)->with('businesstypelist', businesstype::dropdown())->with('contracttermlist',ContractTerm::dropdown());
至
return view('index')->with('addtpcs', $addtpcs)->with('businesstypelist', businesstype::dropdown())->with('contracttermlist',ContractTerm::dropdown());
这解决了那个问题。