class Relay
{
private $privateProperty;
public function __construct()
{
$this->privateProperty = new \stdClass();
}
// метод, который работает с приватным свойством
public function call()
{
return $this->privateProperty;
}
}
use PHPUnit\Framework\TestCase;
class RelayTest extends TestCase
{
public function testCall(): void
{
$reflectionClass = new \ReflectionClass(Relay::class);
$reflectionProperty = $reflectionClass->getProperty('privateProperty');
$reflectionProperty->setAccessible(true);
// создаем наш объект БЕЗ конструктора
$relay = $reflectionClass->newInstanceWithoutConstructor();
// Меняем свойство и вызываем метод, работающий с этим приватным полем
$reflectionProperty->setValue($relay, 1111);
self::assertEquals(1111, $relay->call());
// Меняем свойство и вызываем метод, работающий с этим приватным полем
$reflectionProperty->setValue($relay, 'aaaa');
self::assertEquals('aaaa', $relay->call());
}
}
class RelayTest extends TestCase
public function testCall(): void
{
/** @var Example $stub */
$stub = Stub::make(Relay::class, [
'privateProperty' => 1111,
]);
self::assertEquals(1111, $stub->call());
$stub = Stub::make(Relay::class, [
'privateProperty' => 'aaaa',
]);
self::assertEquals('aaaa', $stub->call());
}
}
bin/consol debug:route <route>
, где <route>
— путь от path, можно через grep искать: bin/console d:r | grep <route_part>
$ bin/console d:r home
+--------------+----------------------------------------------------------------+
| Property | Value |
+--------------+----------------------------------------------------------------+
| Route Name | home |
| Path | /{_locale} |
| Path Regex | {^/(?P<_locale>en|ru)?$}sDu |
| Requirements | _locale: en|ru |
| Class | Symfony\Component\Routing\Route |
| Defaults | _controller: \App\Controller\HomeController::index() |
| | _locale: en |
| Options | compiler_class: Symfony\Component\Routing\RouteCompiler |
| | utf8: true |
+--------------+----------------------------------------------------------------+
bin/consol debug:route
название вашего роута (справа пути с выражениями, слева названия роута — его и подставить в первую команду нужно):users.show ANY ANY ANY /admin/users/{id}
app_login ANY ANY ANY /login
app_logout GET ANY ANY /logout
oauth.fake ANY ANY ANY /fake_login
auth.signup ANY ANY ANY /signup
if ($form->isSubmitted() && $form->isValid())
и уже внедряете свою капчу(OrganisationSeller extends Seller)
будет объектом Organisation.seller
flush()
нужно вынести, потому что вы можете заперсистить 100 объектов и сделать один flush — одна череда обращений к Бд. В вашем же случае будет 100 и более обращений к БДis_a()
и вот это все) и если придет не тот объект — кидать InvalidArgumentException
<?php
// Ваши данные в упрощенном виде (без мусора)
$array = [
'numbers' => [
[
'numbers' => [
[
'formattedValue' => 111,
],
[
'formattedValue' => 3333,
],
[
'formattedValue' => 5555,
],
],
],
[
'numbers' => [
[
'formattedValue' => 200111,
],
[
'formattedValue' => 2003333,
],
[
'formattedValue' => 2005555,
],
],
],
],
];
// Найдет все значения во всех вложенных элементах с нужным ключом
// и сделает это рекурсивно — то есть во всех массивах и их детях.
function searchValues(array $arr, string $search, array $res = []): array {
array_walk_recursive($arr, function($value, $key) use (&$res, $search) {
if ($key === $search) {
$res[] = $value;
}
});
return $res;
}
// Ищем в нашем массиве все значения с ключом `formattedValue`
// и складываем найденные значения в пустой массив (по дефолту),
// но можно передать 3-м параметром и имеющийся массив, тогда значения туда добавятся.
$result = searchValues($array, 'formattedValue')
var_dump($result);
values
, потом при сборке запроса Doctrine достает первый найденный Parameter с ключом values
(а их таких несколько, но ей достаточно первого). values
[$normalizedKey, $key] = $this->getKeys($qb);
$qb
->andWhere(sprintf('%s IN (:%s)', $normalizedKey, $key))
->setParameter($key, $this->getValue());
Symfony\Component\Security\Guard\AuthenticatorInterface
и подсовывать юзера с нужными правами в тестовой среде, тогда легко можно проверять права доступаПомимо "удобства" есть еще какой-то тайный смысл ?Новичкам очень удобно и просто, зачем сложно как хлоп и сделал
Для меня хелперы всегда ассоциировались сКак сказал однажды Аршавин (поплатившись своей карьерой из-за этих слов) "Ваши ожидания — это ваши проблемы" :)
<?php
$data = [
[
'id' => 4,
],
[
'id' => 1,
'start' => 1,
'end' => 50,
'parent_id' => 4,
],
[
'id' => 1,
'start' => 10,
'end' => 50,
'parent_id' => 4,
],
[
'id' => 1,
'start' => 5,
'end' => 100,
'parent_id' => 4,
],
];
function aggregateExtremumBorders(array $elements) {
return array_reduce($elements, function($res, $element) {
if (!isset($element['parent_id'])) {
return $res;
}
$parentId = $element['parent_id'];
$parent = $res[$parentId] ?? ['id' => $parentId, 'min' => null, 'max' => null];
$parent['min'] = min($parent['min'], $element['start']) ?: $element['start'];
$parent['max'] = max($parent['max'], $element['end']) ?: $element['end'];
$res[$parentId] = $parent;
return $res;
}, []);
}
var_dump(aggregateExtremumBorders($data));
то как быть с ситуацией, когда в некоторых модулях должны производиться сложные выборки с фильтрами, агрегацией, затрагивающие сущности (entity) других модулей?
SELECT product.*, last_prices.*
FROM product
LEFT JOIN (
SELECT product_id AS id, max(id) as price_id
FROM price
GROUP BY product_id
) last_prices ON last_prices.id=product.id
А в чем подвох? Почему без round не работает?