<?php
require_once 'vendor/autoload.php';
use FFI\TDLib\TDLib;
// Создаем экземпляр класса FFITdLib
$tdlib = new TDLib();
// Устанавливаем параметры для авторизации
$api_id = 'YOUR_API_ID';
$api_hash = 'YOUR_API_HASH';
$phone_number = 'YOUR_PHONE_NUMBER';
// Выполняем авторизацию
$tdlib->send([
'@type' => 'setTdlibParameters',
'parameters' => [
'api_id' => $api_id,
'api_hash' => $api_hash,
'use_test_dc' => false,
'database_directory' => 'tdlib-db',
'files_directory' => 'tdlib-files',
'use_file_database' => false,
'use_chat_info_database' => false,
'use_message_database' => false,
'use_secret_chats' => false,
'api_key' => '',
'system_language_code' => 'en',
'device_model' => 'unknown',
'system_version' => 'unknown',
'application_version' => '1.0',
'enable_storage_optimizer' => true,
'ignore_file_names' => false,
],
]);
$tdlib->send([
'@type' => 'checkDatabaseEncryptionKey',
'key' => '',
]);
$tdlib->send([
'@type' => 'setAuthenticationPhoneNumber',
'phone_number' => $phone_number,
]);
// Получаем код авторизации
$code = readline('Enter the code: ');
$tdlib->send([
'@type' => 'checkAuthenticationCode',
'code' => $code,
]);
// Выполняем запрос getChatStatistics
$chat_id = 'CHAT_ID';
$result = $tdlib->send([
'@type' => 'getChatStatistics',
'chat_id' => $chat_id,
'is_dark' => false,
]);
print_r($result);
flush()
в процессе обработки preUpdate
приводит к бесконечной рекурсии, ибо обработчик события вызывается в процессе выполнения предыдущего вызова flush()
.persist()
, remove()
и т.п. в процессе обработки событий доктрины может привести к неожиданным результатам. Данные просто могут быть не сохранены, как минимум. Крайне не рекомендую менять какие-либо данные в Entity, EM/UoW при обработке событий доктрины.OrderStatusChanged
. Но лучше использовать более конкретные события вроде OrderCompleted
и OrderCanceled
. flush()
.$this->em->flush();
$this->events->dispatch(new OrderCompleted($order->id));
// или
$this->em->flush();
$this->notificationCreator->createChangeStatusNotification($order->getCustomer());
public function preUpdate(PreUpdateEventArgs $args)
{
$entity = $args->getObject();
if (!$entity instanceof Order) {
return;
}
$this->logger->info($entity);
$onlyStatusChanged = count($args->getEntityChangeSet()) === 1 && $args->hasChangedField('status');
if ($onlyStatusChanged) {
$this->notificationsCreator->createChangeStatusNotification($entity->getCustomer());
}
// много кода...
}
php bin/console doctrine:mapping:import "App\EntityFromDB" annotation --path=src/EntityFromDB
EntityManager::flush()
внутри обработчика события, который сам вызывается в процессе работыEntityManager::flush()
(а точнее UnitOfWork::commit()
), разумеется вы получаете бесконечный цикл.preFlush
вы очищаете внутреннюю переменную (например private array $changes = []
), в которой будетpostPersist
, postUpdate
, postRemove
вы сохраняете в $changes
postFlush
вы передаёте накопленные изменения, формируя message, для которого настроен роутинг в async
транспорт. Обработчик этого message сможет спокойно сохранить все накопленные изменения, не мешая runtime коду.retry_strategy
под свои нужды и оно будет работать. Надо только мониторить failed messages.RecoverableMessageHandlingException
чтобы отменить обработку. Но, опять же, не забудьте про настройки retry strategy чтобы это не приводило к потерянным сообщениям. <?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\BinaryFileResponse;
use Symfony\Component\Routing\Annotation\Route;
class TestController extends AbstractController
{
/**
* @Route("/get-image", name="get_image")
*/
public function getImage()
{
$path = "/home/dariia/Code/sf5_http_kernel_course/public/uploads/article_image/lightspeed-5f687f2402b6f.png";
$response = new BinaryFileResponse($path);
return $response;
}
}
<?php
namespace App\Tests\Controller;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
class TestControllerTest extends WebTestCase
{
public function testRegister()
{
$client = static::createClient();
ob_start();
$client->request('GET', '/get-image');
$client->getResponse()->sendContent();
$this->assertResponseIsSuccessful();
$this->assertResponseHeaderSame('Content-Type', 'image/png');
ob_get_clean();
...
class somethingClass {
function __construct($db) {
$this->db = $db;
}
function somethingFunction(string $key) {
$query = $this->db->prepare("SELECT `key` FROM `table` WHERE `key` = :key");
$query->execute(array(':key' => $key));
return $query->fetchColumn();
}
}
echo 'Ошибка подключения к БД MySQL: ' . $error->getMessage() . ''; die;
- это ад и говнокод. postRemove
прямо указано что это событие вызывается внутри метода flush()
. Таким образом вызывая $this->entityManager->flush()
внутри postRemove
вы, фактически порождаете потенциально бесконечный цикл, поэтому "Undefined index" на самом деле - наименьшая из ваших проблем :)'value' => 'profile.last_name'
. Так же нельзя сделать свойства модели (сущности), приватными. Из-за чего состояние модели можно изменить где угодно и вы никак не проконтролируете это.Yii::$app->user->id
. Вам приходится делать докблок, что User
это common/auth/Identity
, а не yii/web/User