new User()
вместо вашего кодаpublic function getUser($credentials, UserProviderInterface $userProvider)
{
return new User();
}
stateless: true
ContextListener manages the SecurityContext persistence through a session.
!$this->isGranted('IS_AUTHENTICATED_REMEMBERED');
$reflectionExtractor = new ReflectionExtractor();
$phpDocExtractor = new PhpDocExtractor();
$propertyTypeExtractor = new PropertyInfoExtractor([$reflectionExtractor], [$phpDocExtractor, $reflectionExtractor], [$phpDocExtractor], [$reflectionExtractor], [$reflectionExtractor]);
$normalizer = new ObjectNormalizer(null, null, null, $propertyTypeExtractor);
$arrayNormalizer = new ArrayDenormalizer();
$serializer = new Serializer([$arrayNormalizer, $normalizer]);
return $serializer->denormalize($array, ContragentDto::class);
firewalls:
main:
guard:
authenticators:
- App\Security\TokenAuthenticator
entry_point
- используется для начала процесса аутентификации. В вашем случае он не нужен, т.к. у вас api # config/services.yaml
services:
DependencyInterface: '@RealDependency'
# config/services_test.yaml
services:
DependencyInterface: '@FakeDependency'
$hosts = [
'ремонтмитино.рф',
'ремонт-королев.рф',
'ремонтчехов.рф',
'ремонтподольск.рф',
'ремонтдомодедово.рф',
];
$brands = [
'aeg',
'samsung',
'lg',
];
$phrases = [
'Работа холодильника основана на принципе холодильной машины, переносящей тепловую энергию из рабочей камеры – наружу, в кухонное помещение',
'Холодильники делятся на два вида: среднетемпературные камеры для хранения свежих продуктов и низкотемпературные морозильные камеры',
'Прототип морозильника появились несколько тысяч лет назад – использовались помещения для хранения продуктов, наполненные льдом',
'Российский прототип холодильника — ледники, представляющие сруб, погруженный в землю',
'С 1930 года хладагентом в морозильниках является инертный газ фреон',
'Хладагент, обычно, фреон — газ, переносящий лишнее для продуктов тепло от испарителя к конденсатору',
'Холодильник тратит около 10% от общего электропотребления дома',
'Наиболее экономный режим холодильника - когда в нём находится большое количество продуктов',
];
$count = 5;
foreach ($hosts as $host) {
foreach ($brands as $brand) {
srand(crc32($host.$brand)); // Чтобы не хранить результат
$brandPhrases = $phrases;
shuffle($brandPhrases);
echo sprintf("%s %s\n", $host, $brand);
$brandPhrases = array_slice($brandPhrases, 0, $count);
var_dump($brandPhrases);
}
}
$array = array_fill(0, 50, 1);
$sum = 20;
function elements($array, $sum, &$result = [], $iteration = [])
{
// Если нужны все перестановки, то нужно закомментировать условие
if (!empty($result)) {
return;
}
if ($sum === 0) {
$result[] = $iteration;
return;
}
foreach ($array as $index => $value) {
if ($sum - $value < 0) {
continue;
}
$next = $array;
unset($next[$index]);
elements($next, $sum - $value, $result, array_merge($iteration, [$index]));
}
return;
}
elements($array, $sum, $result);
// Если вытащены все возможные перестановки, то разкомментировать
// Отсортируем, чтоб убрать повторяющиеся элементы
//foreach ($result as &$item) {
// sort($item);
//}
//unset($item);
//$result = array_unique($result, SORT_REGULAR);
foreach ($result as $item) {
echo 'Индексы элементов массива, составляющих сумму: ' . implode(' ', $item) . \PHP_EOL;
}
// \App\Kernel
protected function initializeContainer()
{
if ($_ENV['APP_ENV'] === 'dev') {
$container = $this->buildContainer();
$container->setParameter('container.build_id', 'id');
$container->setParameter('container.build_hash', 'hash');
$container->set('kernel', $this);
$container->compile(true);
$this->container = $container;
} else {
parent::initializeContainer();
}
}
smart-core/accelerator-cache-bundle
, возможно другие бандлы тоже несовместимы с таким режимом.{{ render(controller(
AppBundle:Article:recentArticles',
{ 'max': 3 }
)) }}
{{ articles(3) }}
{{ app_version }}
app
, к примеру, тот же инстанс залогиненого пользователя{{ app.user.username }}
$form = $this->container->get('form.factory')
->createNamed(
'account_'. $account->getId(),
AccountType::class,
$account
)
;
public function indexAction(Request $request)
{
$accounts = $this
->getDoctrine()
->getRepository('AppBundle:Account')
->findActive();
$forms = [];
foreach ($accounts as $key => $account){
$form = $this->container->get('form.factory')->createNamed('account_'. $account->getId(), AccountType::class, $account);
// Не надо добавлять кнопки сабмита, их рекомендуется добавлять непосредственно в шаблоне обычным html
// $form->add('submit', SubmitType::class);
$form->handleRequest($request);
// Не надо инжектить форму в сущность, легче просто передать формы в шаблон
// $account->setForm($form);
// $account->setFormView($formView);
if($form->isSubmitted() && $form->isValid()){
// Объекты передаются по ссылке, нет смысла в получение $account повторно
// $data = $form->getData();
$this->addFlash('success', 'Saved');
$em = $this->getDoctrine()->getManager();
// Это актуально только для создания сущности, при редактировании - это не нужно
// $em->persist($data);
$em->flush();
return $this->redirectToRoute('account_list');
} else {
$forms[$account->getId()] = $form->createView();
}
}
return [
'forms' => $forms,
'accounts' => $accounts,
];
}
{# {{ form_row(account.formView) }} #}
{{ form_start(forms[account.id]) }}
{{ form_widget(forms[account.id]) }}
<button>Submit</button>
{{ form_end(forms[account.id]) }}
legacy-lib/
) и прописать"autoload": {
"psr-4": {
"App\\": "src/"
},
"classmap": ["legacy-lib/"]
},
class TaskController
{
/**
* @var ProducerInterface
*/
private $producer;
public function __construct(ProducerInterface $producer)
{
$this->producer = $producer;
}
public function indexAction($name)
{
$this->producer->publish('test');
return new Response();
}
}
# services.yaml
services:
App\Controller\TaskController:
arguments:
- '@old_sound_rabbit_mq.task_producer'
# services.yaml
services:
OldSound\RabbitMqBundle\RabbitMq\ProducerInterface: '@old_sound_rabbit_mq.task_producer'
$query = $em->createQuery(
'SELECT NEW ArticleDTO(ar.title, ar.imagePath, ar.publishedAt, CONCAT(au.firstName, ' ', au.lastName))
FROM Article ar JOIN ar.author au');
$articles = $query->getResult(); // array of ArticleDTO
AnnotationClassLoader
, задачей которого преобразовывать аннотации в роуты. Абстрактный класс есть в компоненте, вам надо только определить метод configureRoute
. За основу можно взять код из фреймворкаnamespace App\Router;
use Symfony\Component\Routing\Loader\AnnotationClassLoader as BaseLoader;
use Symfony\Component\Routing\Route;
class AnnotationClassLoader extends BaseLoader
{
protected function configureRoute(Route $route, \ReflectionClass $class, \ReflectionMethod $method, $annot)
{
if ('__invoke' === $method->getName()) {
$route->setDefault('_controller', $class->getName());
} else {
$route->setDefault('_controller', $class->getName().'::'.$method->getName());
}
}
}
use App\Router\AnnotationClassLoader;
use Doctrine\Common\Annotations\AnnotationReader;
use Doctrine\Common\Annotations\AnnotationRegistry;
use Symfony\Component\Config\FileLocator;
use Symfony\Component\Config\Loader\DelegatingLoader;
use Symfony\Component\Config\Loader\LoaderResolver;
use Symfony\Component\Routing\Loader\AnnotationDirectoryLoader;
use Symfony\Component\Routing\Loader\AnnotationFileLoader;
use Symfony\Component\Routing\Router;
$autoloader = require_once __DIR__ . '/../vendor/autoload.php';
AnnotationRegistry::registerLoader(array($autoloader, 'loadClass'));
$reader = new AnnotationReader();
$annotationClassLoader = new AnnotationClassLoader($reader);
$fileLocator = new FileLocator([__DIR__]);
$loaderResolver = new LoaderResolver([
new AnnotationFileLoader($fileLocator, $annotationClassLoader),
new AnnotationDirectoryLoader($fileLocator, $annotationClassLoader),
]);
$loader = new DelegatingLoader($loaderResolver);
$router = new Router($loader, __DIR__ . '/../src/Controller');
dump($router->getRouteCollection());
$params = $request->request->all();
$files = $request->files->all();
$data = array_replace_recursive($params, $files);
$form->submit($data);
submit
как показано выше