php - 从子类动态设置类
问题描述
我正在尝试使用一些希望可重用的代码在 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
几种不同的方式,但似乎无法使其正常工作。任何帮助表示赞赏!
解决方案
由于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);
}
}
推荐阅读
- java - Android Studio 4.2.1 更改我的图标后删除 mipmap 文件夹?
- javascript - D3 - . 根据子对象数组中是否存在项目过滤 selectAll
- windows - PowerShell 如何显示调用外部终端应用程序 (nssm.exe) 产生的输出字符串
- python - 想要在 Spacy 特征提取中打印特定数字
- python - 如何在具有可重复段落的指定字符串之后读取/修改具有特定位置的行?同时打印所有行
- azure-cosmosdb - 如何在 Azure Cosmos DB 模拟器中访问更改源
- cypress - cypress CLI 可以区分内部错误和一个失败的测试吗?
- shadow-dom - 有没有办法防止创建#shadow-root
- android - 可以使用 ndk 和 tcc 进行 android 应用程序开发吗?
- amazon-web-services - AWS ECS Fargate 蓝绿色部署 - 第二个目标组一直未能通过健康检查