作者:萝莉控的小潴_515 | 来源:互联网 | 2023-09-25 10:18
我有一个用于处理用户输入的 Request 类。它可以验证用户输入并将其转换为所需的格式。
namespace App\Request;
use Request\Request;
class CreateUserRequest extends Request
{
public function __construct()
{
$this->addField('int','user_age');
// ...
}
}
在控制器中:
namespace App\Controller;
use App\Request\CreateUserRequest;
class CreateUserController
{
public function handle()
{
$request = new CreateUserRequest();
if ($request->isValid()) {
} else {
}
}
}
您可以看到,我没有使用依赖注入,并且自定义请求没有工厂,我只是为项目需要的每个请求扩展了 Request 类。请求类目前没有构造函数。
问题:
我想将项目特定的配置数据注入我的项目所拥有的每个请求中,主要是与验证相关的数据:允许的最大整数,日期格式,错误消息等。而且我不知道该怎么做无需更改我现在使用这些类的方式。
我当然可以创建项目特定的 Request 类:
namespace App\Request;
use Request\Request;
class ProjectRequest extends Request
{
public function __construct()
{
$this->setMaxInt(2147483647);
// ...
}
}
但是现在我所有的自定义请求类都应该调用父构造函数:
namespace App\Request;
class CreateUserRequest extends ProjectRequest
{
public function __construct()
{
$this->addField('int','user_age');
// ...
parent::__construct()
}
}
我不太喜欢这种解决方案。如果我忘了调用父构造函数怎么办?
我的下一个想法是在自定义请求类中使用 init 函数,并使构造函数在 ProjectRequest 中最终确定,以防止其被覆盖。
namespace App\Request;
use Request\Request;
class ProjectRequest extends Request
{
public final function __construct()
{
$this->setMaxInt(2147483647);
// ...
$this->init();
}
然后我的自定义请求类将是:
namespace App\Request;
class CreateUserRequest extends ProjectRequest
{
public function init()
{
$this->addField('int','user_age');
// ...
}
}
它可以工作,但是我真的不喜欢这种解决方案,对于其他程序员来说,它可能会混淆 init 方法的作用,为什么不允许使用构造方法...
有更好的解决方案吗?