2017-07-07 21 views
2

私はPHPで新しいです& Symfony。私は働く同じ行動を作りました。 ここでは、個々のアクションを別々の機能に分ける方法を知りませんでした。 Symfony 3/PHP 7.1で実行してください。個々のアクションを別々の機能に分ける方法

<?php 
// AppBundle/Controller/SuccessMYController.php 
namespace AppBundle\Controller; 

use Symfony\Bundle\FrameworkBundle\Controller\Controller; 
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; 
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template; 
use Symfony\Component\HttpFoundation\Request; 

use AppBundle\Entity\SuccessMY; 
use AppBundle\Form\SuccessMYType; 

/** 
* @Route("/success") 
* 
*/ 
class SuccessMYController extends Controller 
{ 
    /** 
    * 
    * @Route("/new/{idTask}", 
    *  name = "MY_success_new") 
    */ 
    public function newSuccessAction(Request $request, $idTask) 
    { 
     if (!$this -> get('security.authorization_checker') -> isGranted('IS_AUTHENTICATED_FULLY')) { 
      throw $this -> createAccessDeniedException(); 
     } 
     $user1 = $this -> get('security.token_storage') -> getToken() -> getUser() -> getId(); 


     // (1) load TASK data for a new Success 
     $em = $this -> getDoctrine() -> getRepository('EinsteMYBundle:TaskMY'); 
     $taskData = $em 
      -> findOneBy([ 'id' => $idTask ]); 


     // (2) create fefault data 
     $newSuccess = new SuccessMY(); 
     $newSuccess 
      -> setUserID($user1) 
      -> setEndTask(false); 


     // (3) display form 
     $form = $this -> createForm(SuccessMYType::class, $newSuccess); 
     $form -> handleRequest($request) -> getData($newSuccess); 


     // ********************************************** 
     // (4) save after submit 
     if ($form -> isSubmitted() && $form->isValid()) { 

      // (4.5.1) The content of the confirmation message 
      $messageFrom = $this -> get('translator') -> trans('success.created'); 

      // Data update newSuccess 
      // (4.5.2) Date assignment 
      $successNewDate = new \DateTime(); 
      $newSuccess 
       -> setDateSuccess($successNewDate); 
      $successNewDate = $newSuccess -> getDateSuccess() -> format('Y-m-d H:i:s'); 


      // (4.6.1) Increase the number 
      $taskData 
       -> setOwnCount($taskData -> getOwnCount() + 1); 

      // (4.6.3) TASK Setting status 
      if ($newSuccess -> getEndTask() == true) { 
       $taskData 
        -> setStatusTask(8); 
       $messageTask = $this -> get('translator') -> trans('task.status.succeed'); 
       $messageFrom = $messageFrom . ' ' . $messageTask; 
      } 


      // **** (4.8) Activities in the database ***** 
      // (4.8.1) Save newly created database success 
      $em2 = $this -> getDoctrine() -> getManager(); 
      $em2 -> persist($newSuccess); 
      $em2 -> flush(); 

      // (4.8.2) Query updating overrides Task with newSuccess 
      $sql 
       = "UPDATE task_MY t 
        INNER JOIN zz_tech_parent e 
         on t.id = e.idParent 
        SET 
         t.success_count = t.success_count + 1 
        WHERE 
         e.idTask = :parTaskId"; 
      $params = [ 
       'parTaskId'  => $idTask, 
      ]; 

      $em4 = $this -> getDoctrine() -> getManager(); 
      $phrase = $em4 -> getConnection() -> prepare($sql); 
      $phrase -> execute($params); 


      // (4.9) Return to task list 
      // And a message about the success of the operation 
      $this -> get('session') -> getFlashBag() -> add('msg', $messageFrom); 

      return 
       $this -> redirect($this -> generateUrl('MY_tasks_all')); 
     } 

     // (5) For bad data return to form 
     return $this -> render('EinsteMYBundle:SuccessMY:newSuccess.html.twig', 
           [ 
            'form'  => $form -> createView(), 
            'taskData' => $taskData, 
           ] 
     ); 
    } 

    // (...) 
} 

類似の機能にコードを送信する方法の例はどこにありますか? 新しいアクティビティを追加するときにコーディングができるだけ透明になるように、どのアクティビティを(できれば)分けるべきですか? 誰かが私を助けることができますか?

+1

1のようなものに変数の名前を変更する必要がありますので、それは本当にリポジトリのインスタンスではなく、EntityManagerを作成します。 '$ em'は実際にTaskMYRepositoryです。 2:エンティティ(またはエンティティの設定/注釈を介してdb)にデフォルト値を設定することができます。4.5.1:あなたはtwigで翻訳を行うことができます。 4.5.2:2と同じです。最後の割り当て($ successNewDate = $ newS ...)は決して使用されません。 4.6.1/4.6.3はこれらが何であるか不明である。 $ em2と$ em4は同じですが、emを2回フェッチする必要はありません。 4.8.2:sql(dql)はリポジトリになければなりません。これの一部(現在のユーザーを新しいSuccessMYに追加したり、タスクの状態を変更するなど)は、イベント駆動型の設計に適合しているようです(変化にリスナーを持ち、ロジックを実行しています) – JimL

+1

フォーム処理' - > getData($ newSuccess)'です。私はこれがモジュール化よりも「クリーンアップ」のほうに終わったことを認識しています。それは少なくとも助言のために – JimL

+0

@JimLを開始するためのどこかにあります。どのようにuserIDのデフォルト値を設定しましたか、私は関数を読み込んでいますか? – user23123

答えて

0

いくつかのアイデアは:

1)あなたのControllerの下に別の方法に、フォームの取り扱いのものを移動します。あなたの$idTaskをTypehintと$taskに名前を変更)エンティティ(SuccessMY)と引数としてRequestオブジェクトにパスし、自分の$form->createView()

... 

public function processForm(SuccessMY $successMy, request $request){ 

    $form = $this -> createForm(SuccessMYType::class, $newSuccess); 
    $form -> handleRequest($request) -> getData($newSuccess); 

    ... 

    return $form->createView(); 

} 

... 

2返す - それは、それが存在する場合は、あなたのためにそのエンティティをロードするためにsymfonyのを行います。

$sql 
      = "UPDATE task_MY t 
       INNER JOIN zz_tech_parent e 
        on t.id = e.idParent 
       SET 
        t.success_count = t.success_count + 1 
       WHERE 
        e.idTask = :parTaskId"; 
     $params = [ 
      'parTaskId'  => $idTask, 
     ]; 

のような何か:

class GroupRepository extends NestedTreeRepository 
{ 
    public function incrementSuccessCounterByTask(YOUR_TASK_TYPE $task){ 
     .... 
    } 
} 

4)あなたは本当に内の複数のエンティティマネージャを持っている必要はありません

public function newSuccessAction(Request $request, !YOUR_TASK_TYPE! $task) 

3)原料のこの種は明らかにリポジトリに属し同じ範囲。したがって、アクションの開始時に1つの$ em = $ this-> getDoctrine() - > getManager()を使用し、必要に応じて使用するだけです。また

を、それらの$ EM1を取り除く$ EM2など - このスポット $em = $this -> getDoctrine() -> getRepository('EinsteMYBundle:TaskMY');

をあなたは$taskMyRepository = ...

+0

Thanks @ StasParshin。応答のために。 SQLコードをRepositoryに移動します。私は何をprocessForm関数に置くのか分からない - コード 'if($ form - > isSubmitted()&& $ form-> isValid())' – user23123

+0

はい、その方法にも妥当性検査のチェックが必要です。あなたの$ emの使い方にも改善の余地があります。私の答えにはいくつかのヒントが追加されます –

関連する問題