Вызов функции-члена на null, услуга проверки телефона - PullRequest
0 голосов
/ 28 февраля 2019

PHP с фреймворком Symfony:

Прежде всего перед контекстом:

Моя форма ввода создается конструктором форм.Там нет ничего плохого.Так что это не проблема

Я делаю систему проверки смс.У меня есть контроллер и 2 службы (validatorservice, smsapi (для вызова API)). Теперь моя validatorservice выглядит следующим образом:

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;
    }
}
}

Тогда мой homecontroller:

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
    }

Теперь, что бы я нипопробуй я получу ошибку:

вызов функции-члена validate () для null

Сначала я подумал, что это может быть что-то с именами constructor, но нашелонлайн, что это не имеет значения вообще (также я не получил никаких ошибок кода там)

Затем я попытался добавить эхо в оператор if в моем сервисе.Может возвращать true или false рассматривается как null, но это тоже не работает.

Ответы [ 3 ]

0 голосов
/ 28 февраля 2019

Это должно работать как задумано, если вы измените свой код на это:

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

private $validatorService;

public function __construct(SmsApi $smsApi, ValidatorService $validatorService)
{
    $this->validatorService = $validatorService;
    $this->smsApi = $smsApi;
}
0 голосов
/ 28 февраля 2019

__ construct1 и __construct2 не являются встроенными функциями php, поэтому при загрузке класса конструкторы не вызываются и validatorService / smsApi не устанавливаются (поэтому они имеют значение null).Собственная функция называется __construct.

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

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

Или, если не работает, введите службы как аргумент в

public function indexAction(Request $request)

, так что ...

public function indexAction(Request $request,SmsApi $smsApi, ValidatorService $validatorService)

и use $validatorService->validate();

0 голосов
/ 28 февраля 2019

Полагаю, это из-за количества аргументов в конструкторе.Если вы определяете несколько конструкторов для класса, они должны иметь различное количество аргументов.

Вместо этого вы можете проверить, является ли полученный вами объект частью требуемого класса / классов.Или создайте статические функции, которые устанавливают класс с различными типами объектов.


РЕДАКТИРОВАТЬ Используйте механизмы автопроводки по умолчанию:

private $smsApi;
private $validatorService;

public function __construct(SmsApi $smsApi, ValidatorService $validatorService)
{
    $this->smsApi = $smsApi;
    $this->validatorService = $validatorService;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...