Установить класс динамически из дочернего класса - PullRequest
0 голосов
/ 07 февраля 2020

Я пытаюсь динамически запускать разные классы в PHP, используя некоторый, возможно многократно используемый код, но у меня возникают проблемы с поиском правильного способа сделать это.

В настоящее время я выполняю запрос POST с данные передаются следующим образом:

Route::post('/user/create', 'UserController@createItem');

Для UserController:


namespace App\Http\Controllers;

use Illuminate\Cache\Repository;
use App\Models\User;

class UserController extends AbstractController{
    const className = 'User';
}

И AbstractController:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use GuzzleHttp\Exception\RequestException;
use App\Models\User;

class AbstractController extends Controller
{

    public function createItem() {
        $inputJSON = file_get_contents('php://input');
        $this->className::buildItem($inputJSON);
        return;
    }
}

Который в идеале должен вызывать данные c метод с именем buildItem()

Когда я проверяю это путем жесткого кодирования User в AbstractController, он работает как положено, но когда я пытаюсь сделать это таким образом, я получаю сообщение об ошибке в PostMan:

ErrorException: Undefined property: App\Http\Controllers\UserController::$className in file .../app/Http/Controllers/AbstractController.php on line 14

Я попытался объявить и сослаться на className несколькими различными способами, но, похоже, не могу заставить это работать. Любая помощь приветствуется!

1 Ответ

0 голосов
/ 07 февраля 2020

Поскольку в реализации определено className, вы можете получить к нему доступ с помощью поздний срок c привязка - static::className.

Вам также необходимо добавить предысторию классов моделей. пространство имен.

Это становится:

class AbstractController extends Controller
{
  private const MODELS_NAMESPACE = 'App\\Models';

  public function createItem()
  {
    $inputJSON = file_get_contents('php://input');
    $className = self::MODELS_NAMESPACE . '\\' . static::className;
    $className::buildItem($inputJSON);
  }
}

Демонстрация: https://3v4l.org/Ng6bl

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...