Попытка присвоить свойство необъекта - Laravel 5.2
Проблема: преобразование моего кода Laravel 4 в Laravel 5.2. Я нахожусь в точке перемещения и преобразования моих взглядов и не могу обойти следующую ошибку.
Ошибка: ErrorException в строке IndexController.php 27: Попытка назначить свойство не-объекта
Отладочная информация:
- в строке IndexController.php 27
- в HandleExceptions->handleError('2', 'Попытка присвоить свойство не-объекта', 'C:\Apache24\B2B_Contracts\app\Http\Controllers\IndexController.php', '27', массив ('numberofpcs' => object(дополнительные PC), 'addtpcs' => массив ('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 - (Это только здесь, чтобы показать, что у меня есть файл BaseController.php для IndexController. Я знаю, что 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);
}
}
}
2 ответа
Патрикус помог мне найти этот ответ, но я хотел опубликовать его, потому что при ответе на него все еще были проблемы. Однако он был прав в том, что я больше не мог использовать макеты контроллеров.
Я изменился
$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 5. Из-за этого setupLayout()
метод не вызывается, то есть ваш layout
свойство остается просто строкой "мастер". Так как это просто строка, когда вы делаете $this->layout->content = ...
вы пытаетесь назначить свойство не-объекта.
Я верю, что вы сможете добавить это обратно, если хотите. В вашем 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;
}