Мне трудно понять ошибку в коде. На SO есть некоторые похожие проблемы, но они не очень помогли с моей конкретной проблемой. Я также погуглил всевозможные фразы об ошибке, но все равно без радости. В ProductCategoryController.php у меня есть:

namespace App\controllers\admin;


use App\classes\CSRFToken;
use App\classes\Request;
use App\classes\ValidateRequest;
use App\models\Category;

class ProductCategoryController
{
    public $table_name = 'categories';
    public $categories;
    public $links;

    public function __construct()
    {
        $obj = new Category();
        $total = Category::all()->count(); // total number of rows
        list($this->categories, $this->links) = paginate(3, $total, $this->table_name, $obj);
    }

    public function show() {
        return view('admin/products/categories',
            [
                'categories' => $this->categories,
                'links' => $this->links
            ]);
    }

}

Я получаю ошибку

using $this when not in object context

В строке 27, где я назначаю 'categories' => $this->categories и 'links' => $this->links

Когда я пытаюсь установить «категории» и «ссылки» на пустой массив, все работает нормально, как и ожидалось.

enter image description here

В RouteDispatcher.php у меня есть: введите описание изображения здесь

Возможно, мне не хватает чего-то очень очевидного, любая поддержка в решении моей проблемы приветствуется.

1
Babagana Zannah 17 Фев 2018 в 19:16

1 ответ

Лучший ответ

В диспетчере вы вызываете метод своего контроллера статически.

В вашем коде вы проверяете, можно ли вызвать ваш метод в новом экземпляре. И затем не продолжайте повторно использовать этот вновь созданный экземпляр при вызове. Вместо этого вы используете имя класса и метода в call_user_func_array - и поэтому вызываете его статически, что приводит к вашей ошибке.

Попробуйте изменить свой код на что-то вроде этого:

$controller = new $this->controller;
$method     = $this->method;

if(is_callable(array($controller, $method)))
    call_user_func_array(array($controller, $method), $params);

Или переместите new:

if(is_callable(array($this->controller, $this->method)))
    call_user_func_array(
        array(new $this->controller, $this->method),
        $params
    );
3
Progrock 17 Фев 2018 в 22:27