Php 对空成员函数的调用,电话验证服务

Php 对空成员函数的调用,电话验证服务,php,symfony,Php,Symfony,使用Symfony框架的PHP: 首先,在上下文之前: 我的输入表单正在由表单生成器生成。那里没有什么问题。所以这不是问题所在 我正在做一个短信验证系统。我有一个控制器和两个服务validatorservice,smsapifor api调用现在我的验证服务如下所示: class ValidatorService { public function validate($telefoonnummer) { $pregpatternNL = '(^\+[0-9]{2}|^\+[0-9]{2

使用Symfony框架的PHP:

首先,在上下文之前:

我的输入表单正在由表单生成器生成。那里没有什么问题。所以这不是问题所在

我正在做一个短信验证系统。我有一个控制器和两个服务validatorservice,smsapifor api调用现在我的验证服务如下所示:

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
    }
现在,无论我尝试什么,我都会得到错误:

调用成员函数验证为空

起初,我认为这可能和构造函数名有关,但在网上发现这一点都不重要,而且我在那个里也并没有收到任何代码错误


然后我尝试在我的服务中向if语句添加echo。可能return true或false被视为null,但这也不起作用。

我想这是因为每个构造函数的参数数量。如果为一个类定义了多个构造函数,它们应该具有不同的参数计数

您可以做的是检查您收到的对象是否是所需类的一部分。 或者创建静态函数,用不同的对象类型来稳定类

编辑 使用默认的自动布线机制:

private $smsApi;
private $validatorService;

public function __construct(SmsApi $smsApi, ValidatorService $validatorService)
{
    $this->smsApi = $smsApi;
    $this->validatorService = $validatorService;
}

我想这是因为每个构造函数的参数数量。如果为一个类定义了多个构造函数,它们应该具有不同的参数计数

您可以做的是检查您收到的对象是否是所需类的一部分。 或者创建静态函数,用不同的对象类型来稳定类

编辑 使用默认的自动布线机制:

private $smsApi;
private $validatorService;

public function __construct(SmsApi $smsApi, ValidatorService $validatorService)
{
    $this->smsApi = $smsApi;
    $this->validatorService = $validatorService;
}

如果您将代码更改为:

/** @var SmsApi */
private $smsApi;

private $validatorService;

public function __construct(SmsApi $smsApi, ValidatorService $validatorService)
{
    $this->validatorService = $validatorService;
    $this->smsApi = $smsApi;
}

如果您将代码更改为:

/** @var SmsApi */
private $smsApi;

private $validatorService;

public function __construct(SmsApi $smsApi, ValidatorService $validatorService)
{
    $this->validatorService = $validatorService;
    $this->smsApi = $smsApi;
}

__construct1和_construct2不是php的本机函数,因此在加载类时,构造函数不会调用,validatorService/smsApi也不会被设置为null。本机函数称为uu构造

/** @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)
所以


并使用$validatorService->validate

\uuuu construct1和\uuuu construct2不是php的本机函数,因此加载类时,构造函数不会调用,validatorService/smsApi也不会被设置为null。本机函数称为uu构造

/** @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)
所以


并使用$validatorService->validate

您可以在调用方法之前尝试转储服务。你们的施工人员在工作吗?我不知道您可以定义多个,symfony可以处理DI。这至少与您的错误相匹配,因为类变量仍然为null。编辑:顺便说一句,为什么不直接在表单中使用验证?@WhiteRabbit php.net表明这是可能的。我想不出任何其他方法来解决这个问题。PHP不支持多个构造函数,是的,名称非常重要。你误读了什么,或者有人在跟你开玩笑。只需使用一个带两个参数的构造函数。PHP不太喜欢多态性。我在我的应用程序中做了一个快速测试,如果我按照你的方式尝试,我的服务不会自动连接。为什么不使用standart\uuu构造方法?可以在调用该方法之前尝试转储服务。你们的施工人员在工作吗?我不知道您可以定义多个,symfony可以处理DI。这至少与您的错误相匹配,因为类变量仍然为null。编辑:顺便说一句,为什么不直接在表单中使用验证?@WhiteRabbit php.net表明这是可能的。我想不出任何其他方法来解决这个问题。PHP不支持多个构造函数,是的,名称非常重要。你误读了什么,或者有人在跟你开玩笑。只需使用一个带两个参数的构造函数。PHP不太喜欢多态性。我在我的应用程序中做了一个快速测试,如果我按照你的方式尝试,我的服务不会自动连接。你为什么不使用标准构造法呢?好吧,我不知道第一种。不管怎样,两个构造函数都只需要一个参数…@JornBarkhof我想用多个构造函数是不可能实现你的目标的。改用一个,并为您的类键入check。PHP是动态的,不能像你所希望的那样处理你的情况。谢谢,我现在把它变成了一个构造函数。但我仍然得到相同的错误修复它,缓存清除,现在它的工作,非常感谢!啊,好吧,我真的不知道第一个。不管怎样,两个构造函数都只需要一个参数…@JornBarkhof我想用多个构造函数是不可能实现你的目标的。改用一个,并为您的类键入check。PHP是动态的,不能像你所希望的那样处理你的情况。谢谢,我现在把它变成了一个构造函数。但我还是遇到了同样的错误修复了它,缓存c
已经学习,现在可以使用了,非常感谢!是的,谢谢,我在1分钟前就已经想到了这个问题,但仍然得到了相同的错误清除本地缓存并检查您的类是否注册为service:php bin/console debug:container或debug:autowiring您应该找到一个带有类名称空间的条目是的,谢谢,我在1分钟前就想到了这个问题,仍然会出现相同的错误请清除本地缓存并检查您的类是否注册为service:php bin/console debug:container或debug:autowiring您应该找到一个具有类名称空间的条目