Symfony 2.1 で構築された求人ポータルのサイトに取り組んでいます。ewz/EWZSearchBundle
以下のような求職プロセスを実装しました。
/**
* Displays a form to create a new Job entity.
*
* @Route("/new", name="job_new")
* @Template("JobBundle:Job:new.html.twig")
*/
public function newAction(Request $request)
{
$entity = new Job();
$form = $this->createForm(new JobType(), $entity);
if('POST'===$request->getMethod()){
$form->bind($request);
if ($form->isValid()) {
$entity->setOwner($this->getEmployer());
$em = $this->getDoctrine()->getManager();
$em->persist($entity);
$em->flush();
$location = $entity->getLocation();
$loName = array();
foreach ($location as $key => $loc) {
$loName[] = $loc->getName();
}
$industry = $entity->getIndustry();
$inName = array();
foreach ($industry as $key => $ind) {
$inName[] = $ind->getTitle();
}
$skills = $entity->getSkills();
$skillName = array();
foreach ($skills as $key => $skl) {
$skillName[] = $skl->getTitle();
}
$education = $entity->getEducation();
$educationName = array();
foreach ($education as $key => $edu) {
$educationName[] = $edu->getTitle();
}
$search = $this->get('ewz_search.lucene');
$document = new Document();
$document->addField(Field::keyword('key', $entity->getId()));
$document->addField(Field::text('title', $entity->getTitle()));
$document->addField(Field::text('url', $this->generateUrl('job_show', array('slug' => $entity->getSlug()))));
$document->addField(Field::unstored('body', $entity->getDescription()));
$document->addField(Field::text('location', implode(" ", $loName)));
$document->addField(Field::text('industry', implode(" ", $inName)));
$document->addField(Field::text('skills', implode(" ", $skillName)));
$document->addField(Field::text('education', implode(" ", $educationName)));
$search->addDocument($document);
$search->updateIndex();
return $this->redirect($this->generateUrl('job_show', array('slug' => $entity->getSlug())));
}
}
return array(
'entity' => $entity,
'form' => $form->createView(),
);
}
候補者が次の分野のいずれかで仕事を探している場合、それは非常にうまく機能しています:場所、産業、スキル、または教育。しかし、私には2つの問題があります:
すべてのフィールド (場所、スキル、業界、または教育) に対するこのプロセスでは、1 つの求人検索のみが適用されますが、別の検索フォームが必要です。たとえば、場所ごとの検索では、場所フィールドのみが一致し、他の残りのフィールドは一致しません。
2番目の問題は、雇用主が自分の仕事を削除すると、削除された仕事のインデックスも検索プロセスに表示されますが、仕事が削除された後、削除された仕事のインデックスも検索インデックスから削除する必要があります。
job_delete
次のコードで、アクション時に検索インデックスを削除しようとしました。
/**
* Deletes a Job entity
* @Route("/{slug}/delete", name="job_delete")
* @Method("POST")
*/
public function deleteAction(Request $request, $slug)
{
$em = $this->getDoctrine()->getManager();
$entity = $em->getRepository('JobBundle:Job')
->findOneBy(array('slug' => $slug));
if (!$entity) {
throw $this->createNotFoundException('Unable to find Job entity.');
}
$form = $this->createDeleteForm($entity->getSlug());
$form->bind($request);
if ($form->isValid()) {
$this->checkOwnerSecurity($entity);
$em->remove($entity);
$em->flush();
$search = $this->get('ewz_search.lucene');
$index = $search->getIndex();
$removePath = 'http://localhost/Jobtook/web/app_dev.php/employer/job/{slug}/delete';
$hits = $index->find('job_delete' . $removePath);
foreach ($hits as $hit) {
$index->delete($hit->id);
}
}
return $this->redirect($this->generateUrl('job'));
}
private function createDeleteForm($slug)
{
return $this->createFormBuilder(array('slug' => $slug))
->add('slug', 'hidden')
->getForm()
;
}
しかし、このコードでは、多くのジョブを作成して 1 つのジョブのみを削除すると、データベースにまだ存在するジョブが残っていても、すべてのジョブが検索インデックスから削除されます。何が間違っているのかわかりません。