Я определил ряд функций объекта Tag (индекс, создание, редактирование и т. Д.) Как сервис. Когда я создаю сообщение в форме, я добавляю поле «теги», чтобы включить теги, связанные с этим сообщением.
У меня вопрос: как я могу реализовать функции, которые я определил в TagManager? Функция, которую я хочу использовать, называется ‘newOrLoadTag’. Я не уверен, как я должен использовать это, если внутри PostController или PostForm.
Мой второй вопрос, как я могу ограничить входные теги? Я хочу, чтобы в сообщении было не более 5 тегов. Я думаю, что я должен определить поле «теги» сущности Post как массив размером 5. Это лучший способ сделать это? Если это так, как я могу это реализовать?
Вы должны запретить добавление более 5 тегов на стороне клиента (js), лично я бы использовал множественный выбор selected.js или tagsinput.js
Ваша функция newOrLoad внутри tagservice может выглядеть так:
public function newOrLoadTag($tagName){
$foundTag=$tagRepo->findOneByName($tagName);
if($foundTag){
return $foundTag;
}else{
//should return instance of Tag
return $this->createTag($tagName)
}
}
внутри вашего PostController вы можете получить теги из запроса, давайте предположим, что это строка и выбранный тэг разделены «;»
if ('POST' === $request->getMethod()) {
$form->handleRequest($request);
if ($form->isValid()) {
$post=$form->getData();
// get tags from request
$tags=$request->get('tags') ? urldecode($request->get('tags')) : false;
// persist the post and remove all tags
$em->persist($post);
foreach ($entity->getTags() as $tag) {
$post->removeTag($tag);
}
// add all tags
if($tags){
$tags=explode(';', $tags);
$c=1;
foreach ($tags as $tag) {
if($c<=5){
$tag = $tagService->newOrLoadTag($tag);
$post->addTag($tag);
}
$c++;
}
}
//...
Других решений пока нет …