在电话验证服务为null的情况下调用成员函数

时间:2019-02-28 14:07:55

标签: php symfony

带有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,但这也不起作用。

3 个答案:

答案 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();