Symfony 2 ContextErrorException Только переменные должны передаваться по ссылке при запуске миграции Doctrine.

Когда я запускаю Doctrine Migration, я получаю следующую ошибку:

Миграция 20141217162533 не выполнена во время выполнения. Ошибка выполнения
Примечание: только переменные должны передаваться по ссылке

[Symfony \ Component \ Debug \ Exception \ ContextErrorException] Время выполнения
Примечание: только переменные должны передаваться по ссылке

на $this->validateUsername линия. Когда я это комментирую, все работает нормально.

Это кажется очень странной ошибкой во время выполнения, и я не могу понять, почему я получаю это.

public function up(Schema $schema)
{
foreach ($this->old_users as $old_user) {
if ($this->validateUsername($old_user['email']) === false or $this->checkDNSRecord($old_user['email']) === false) {
$this->addSql("INSERT INTO User (email, joined_on, unsubscribed) VALUES ('" . $old_user['email'] . "', '" . $old_user['joined_on'] . "', 0)");
}
}
}

/**
* Validate the username/email address based on the structure (e.g. [email protected])
*
* @param $email
*
* @return bool
*/
public function validateUsername($email)
{
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
// email is NOT valid
return false;
} else {
// email is valid
return true;
}
}

/**
* Validate the MX line of the DNS record for the host of the email address (e.g. @aol.co.uk)
*
* @param $email
*
* @return bool
*/
public function checkDNSRecord($email)
{
if (checkdnsrr(array_pop(explode('@', $email)), 'MX')) {
return true;
} else {
return false;
}
}

1

Решение

Проблема в том, что функции как array_pop принимает массив по ссылке, так как он изменяет его содержимое (удаляет последний элемент из массива). Теперь вы передаете результат explode прямо в array_pop array_pop(explode('@', $email)) следовательно, php не может передать этот результат по ссылке, потому что это не переменная. Решение довольно простое, просто продолжайте explode привести к временной переменной:

<?php
/* ... */
$mailParts = explode('@', $email);
checkdnsrr(array_pop($mailParts), 'MX');
/* ... */
5

Другие решения

Это работает лучше?

public function up(Schema $schema)
{
foreach ($this->old_users as $old_user) {
$old_email = $old_user['email'];
if ($this->validateUsername($old_email) === false or $this->checkDNSRecord($old_user['email']) === false) {
$this->addSql("INSERT INTO User (email, joined_on, unsubscribed) VALUES ('" . $old_user['email'] . "', '" . $old_user['joined_on'] . "', 0)");
}
}
}
0

По вопросам рекламы [email protected]