/**
* @OneToMany(targetEntity="Article", mappedBy="topic", cascade={"persist", "remove"})
*/
private $articles;
/search/{region}/{city}
и /search
— разные роуты/**
* @Route("/search")
* @ParamConverter("region", converter="querystring")
* @ParamConverter("city", converter="querystring")
*/
public function index(string $region, string $city)
{
return new Response(print_r($name, true));
}
class QueryStringConverter implements ParamConverterInterface
{
public function supports(ParamConverter $configuration)
{
return 'querystring' == $configuration->getConverter();
}
public function apply(Request $request, ParamConverter $configuration)
{
$param = $configuration->getName();
if (!$request->query->has($param)) {
return false;
}
$value = $request->query->get($param);
$request->attributes->set($param, $value);
}
}
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())
и уже внедряете свою капчуflush()
нужно вынести, потому что вы можете заперсистить 100 объектов и сделать один flush — одна череда обращений к Бд. В вашем же случае будет 100 и более обращений к БДis_a()
и вот это все) и если придет не тот объект — кидать InvalidArgumentException
Symfony\Component\Security\Guard\AuthenticatorInterface
и подсовывать юзера с нужными правами в тестовой среде, тогда легко можно проверять права доступа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
http://172.17.0.1
в переменных окружения (не в файле их имитирующем .env) должны стоять верные параметры подключения[error] Migration DoctrineMigrations\Version20200628093518 failed during...
twig.extension
By default, the form will redirect to the URL the user requested (i.e. the URL which triggered the login form being shown). For example, if the user requestedhttp://www.example.com/admin/post/18/edit
, then after they have successfully logged in, they will be sent back tohttp://www.example.com/admin/post/18/edit.
Redirecting after Success¶
always_use_default_target_path
: ON CONFLICT (expression) DO NOTHING
и похожие решения в других СУБД могут быть иногда довольно подходящими в виду простоты реализации...$sql = <<<SQL
INSERT INTO table (id, value)
VALUES (555, \'uniqValue\')
ON CONFLICT (value) DO NOTHING
SQL;
$this->em->getConnection()->executeQuery($sql);
EntityName
+ Controller
, то есть для User это будет UserController
./**
* @Security("is_granted('ROLE_CAN_EDIT_USER')")
*/
class UserController extends EasyAdminController
Подробнее: item_permission
try {
// логика
} catch(\Throwable $e) {
// тут например логируем
// тут мы 3-м параметром для нового исключения добавили прошлое исключение
// чтобы не потерять стектрейс изначальной ошибки, мало ли откуда текущий код был вызван
// о чем и говорит PhpStan
throw new MyException('msg', 0, $e);
}