首页 > 解决方案 > 从子类动态设置类

问题描述

我正在尝试使用一些希望可重用的代码在 PHP 中动态运行不同的类,但我无法找到正确的方法。

目前,我正在运行一个 POST 请求,数据流如下:

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

对用户控制器:


namespace App\Http\Controllers;

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

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

和抽象控制器:

<?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;
    }
}

理想情况下应该调用一个名为的静态方法buildItem()

当我通过硬编码User到 AbstractController 中进行测试时,它按预期工作,但是当我尝试这样做时,我在 PostMan 中收到错误:

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

我尝试过声明和引用className几种不同的方式,但似乎无法使其正常工作。任何帮助表示赞赏!

标签: phplaravel

解决方案


由于className在实现中定义,您可以使用后期静态绑定通过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


推荐阅读