带有Symfony框架的PHP:
首先在上下文之前
我的输入表单正在由表单构建器构建。那里没事。所以那不是问题
我正在制作一个短信验证器系统。我有一个控制器和2个服务(validatorservice,smsapi(用于api调用)),现在我的validateatorservice看起来像这样:
class ValidatorService
{
public function validate($telefoonnummer)
{
$pregpatternNL = '(^\+[0-9]{2}|^\+[0-9]{2}\(0\)|^\(\+[0-9]{2}\)\(0\)|^00[0-9]{2}|^0)([0-9]{9}$|[0-9\-\s]{10}$)';
if (!preg_match($pregpatternNL, $telefoonnummer)) {
return false;
} else {
return true;
}
}
}
然后是我的家庭控制器:
use App\Service\ValidatorService;
class HomeController extends AbstractController
{
/** @var SmsApi */
private $smsApi;
/** @var validatorService */
private $validatorService;
public function __construct1(SmsApi $smsApi, Validatorservice
$validatorService)
{
$this->smsApi = $smsApi;
$this->validatorService = $validatorService;
}
/**
* @Route("/")
* @Template()
*
* @param Request $request
*
* @return array
*/
public function indexAction(Request $request)
{
$form = $this->createForm(
SmsLogFormType::class,
new SmsLog(),
[
'method' => 'post',
]
);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
/** @var SmsLog $smslog */
$formData = $form->getData();
try {
$telefoonnummer = $formData->getTel();
$telefoonnummer = preg_replace('/[^0-9]/', '', $telefoonnummer);
$validatorservices = $this->validatorService-
>validate($telefoonnummer);
if ($validatorserviceres === false) {
$this->addFlash(
'notice',
'telefoonnummer onjuist formaat'
);
exit;
} else {
blablabla
}
现在无论我尝试什么,我都会收到错误消息:
在null上调用成员函数validate()
起初我以为可能是带有constructor
名称的东西,但是在网上发现那根本没有关系(而且我在那里也没有收到任何代码错误)
然后,我尝试在服务中的if语句中添加echo。也许返回true或false被视为null
,但这也不起作用。
答案 0 :(得分:1)
我想这是由于每个构造函数的参数数量。如果为一个类定义多个构造函数,则它们应具有不同的参数计数。
您可以做的是检查您收到的对象是否属于所需类的一部分。 或创建静态函数以使类具有不同的对象类型。
编辑 使用默认的自动装配机制:
private $smsApi;
private $validatorService;
public function __construct(SmsApi $smsApi, ValidatorService $validatorService)
{
$this->smsApi = $smsApi;
$this->validatorService = $validatorService;
}
答案 1 :(得分:1)
如果您将代码更改为此:
/** @var SmsApi */
private $smsApi;
private $validatorService;
public function __construct(SmsApi $smsApi, ValidatorService $validatorService)
{
$this->validatorService = $validatorService;
$this->smsApi = $smsApi;
}
答案 2 :(得分:1)
__ construct1和__construct2不是php的本机函数,因此在加载类时,不会调用构造函数,并且不会设置validateatorService / smsApi(因此它们为null)。本机函数称为__construct。
/** @var SmsApi */
private $smsApi;
private $validatorService;
public function __construct(SmsApi $smsApi, ValidatorService $validatorService)
{
$this->smsApi = $smsApi;
$this->validatorService = $validatorService;
}
或者,如果不起作用,则将服务作为arg注入
public function indexAction(Request $request)
所以...
public function indexAction(Request $request,SmsApi $smsApi, ValidatorService $validatorService)
和use $validatorService->validate();