<?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/EntityFromDBEntityManager::flush() внутри обработчика события, который сам вызывается в процессе работыEntityManager::flush() (а точнее UnitOfWork::commit()), разумеется вы получаете бесконечный цикл.preFlush вы очищаете внутреннюю переменную (например private array $changes = []), в которой будетpostPersist, postUpdate, postRemove вы сохраняете в $changespostFlush вы передаёте накопленные изменения, формируя 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