2014-08-31 16 views
0

我想要能够从我的所有控制器访问代码,那么实现它的最佳方式是什么?下面的代码是处理表单错误,我一直在我的项目中的每一个控制器中复制它。将复制代码移动到适当的地方并从所有控制器访问它们

所以我想保持getErrorMessages()其他地方,并在控制器下面访问它。

注:我读了约services,但感到困惑和this example

示例控制器:

class HelloController extends Controller 
{ 
    public function processAction(Request $request) 
    { 
     //More code here 

     if ($form->isValid() !== true) 
     { 
      $errors = $this->getErrorMessages($form); 

      return $this->render('SayHelloBundle:hello.html.twig', 
        array(
         'page' => 'Say Hello', 
         'form' => $form->createView(), 
         'form_errors' => $errors 
        )); 
     } 

     //More code here 
    } 

    private function getErrorMessages(FormInterface $form) 
    { 
     $errors = array(); 

     foreach ($form->getErrors() as $error) 
     { 
      $errors[] = $error->getMessage(); 
     } 

     foreach ($form->all() as $child) 
     { 
      if (! $child->isValid()) 
      { 
       $options = $child->getConfig()->getOptions(); 
       $field = $options['label'] ? $options['label'] : $child->getName(); 
       $errors[$field] = implode('; ', $this->getErrorMessages($child)); 
      } 
     } 

     return $errors; 
    } 
} 
+0

如果你使用Form Symfony2的组件,你不需要getErrorMessages功能,因为错误是自动表单组件处理(见关于书表格文档,食谱和组件)。 – 2014-08-31 12:30:18

+0

上面的代码只是一个例子! – BentCoder 2014-08-31 12:37:07

回答

0

OK做到了:)

/var/www/html/local/sport/app/config/config.yml

imports: 
    - { resource: services.yml } 

在/ var/www/html等/本地/运动/应用/配置/ services.yml

parameters: 
    form_errors.class: Football\TeamBundle\Services\FormErrors 

services: 
    form_errors: 
     class: %form_errors.class% 

/var/www/html/local/sport/src/Football/TeamBundle/Services/FormErrors.ph p

namespace Football\TeamBundle\Services; 

use Symfony\Component\Form\FormInterface; 


class FormErrors 
{ 
    public function getErrors(FormInterface $form) 
    { 
     $errors = array(); 

     //This part get global form errors (like csrf token error) 
     foreach ($form->getErrors() as $error) 
     { 
      $errors[] = $error->getMessage(); 
     } 

     //This part get errors for form fields 
     foreach ($form->all() as $child) 
     { 
      if (! $child->isValid()) 
      { 
       $options = $child->getConfig()->getOptions(); 
       $field = $options['label'] ? $options['label'] : ucwords($child->getName()); 
       //There can be more than one field error, that's why implode is here 
       $errors[strtolower($field)] = implode('; ', $this->getErrors($child)); 
      } 
     } 

     return $errors; 
    } 
} 

控制器

if ($form->isValid() !== true) { 
    $errors = $this->get('form_errors')->getErrors($form); 
    echo '<pre>'; print_r($errors); exit; 
} 
0

您可以创建一个拥有这一切的基础业务类和调用你的控制器,类(或一组类)。

相关问题