मेरे सिम्फनी प्रोजेक्ट में मेरे दो विचार हैं। विशिष्ट निकाय का विवरण दृश्य और दिनांक परम द्वारा कुछ अन्य डेटा के साथ मुझे एक नए दृश्य में ले जाने के लिए एक बटन।

मेरे पास कोड के साथ समस्या दूसरी विधि से पहले से 'पिछले पर लौटें' पृष्ठ बटन उत्पन्न करने की है ..

कोड:

/**
 * @Route("/details/{id}", name="first_method")
 */
public function firstMethod(Detail $id)
{
    $workspace = $this->entityManager
        ->getRepository(Detail::class)
        ->find($id);

    $build['detail'] = $detail;

$form = $this->createFormBuilder()
        ->add('date', DateTimeType::class, [
            'data' => new \DateTime(),
            'widget' => 'single_text'
        ])
        ->add(
            'save',
            SubmitType::class,
            [
                'attr' => ['class' => 'btn-submit']
            ]
        )
        ->getForm();

    $form->handleRequest($request);

    if ($form->isSubmitted() && $form->isValid()) {
        $data = $form->getData();
        $date = $data['date']

        return $this->redirectToRoute('second_method', [
            'date' => $date
        ]);
    }

    return $this->render('first-method.html.twig', [
          'detail' => $detail,
        ]);
}

और वह 'दूसरी' विधि है:

 /**
 * @Route("/second-method/{date}", name="second_method")
 */
public function secondMethod($date)
{
    return $this->render('second-method.html.twig', [
        'someData' => $someData,
        'date' => $date,
    ]);
}

मेरे पास second_method टहनी दृश्य पर एक बटन है जिसे मुझे वापस method_one पृष्ठ पर वापस करने की आवश्यकता है।

इसे कैसे पूरा किया जा सकता है क्योंकि पैरामीटर $id शायद दूसरी विधि में जरूरी है लेकिन इसे प्रदान करने का कोई तरीका नहीं मिल रहा है। शायद कोई और रास्ता हो? क्या कोई मदद कर सकता है?

मुझे लगता है कि इस पहले तरीके से यह मुझे पसंद आएगा:

{{ path('first_method', {'detailId':detail.id}) }}
0
user14384172 16 अक्टूबर 2020, 14:34

2 जवाब

सबसे बढ़िया उत्तर

जैसा कि @msg द्वारा संकेत दिया गया है, आपको अपने दूसरे पृष्ठ पर दूसरा पैरामीटर प्रदान करना चाहिए। फिर आपको Detail रूपांतरण के लिए @Entity एनोटेशन और दिनांक रूपांतरण के लिए @ParamConverter एनोटेशन की आवश्यकता होगी:

/**
 * @Route("/second_method/{id_detail}/{date}", name="second_method")
 * @Entity("detail", expr="repository.find(id_detail)")
 * @ParamConverter("date", options={"format": "!Y-m-d"})
 */
public function (Detail $detail, \DateTime $date)
// ...

पैरामीटर रूपांतरण पहली विवेक जांच करेगा और यदि इकाई मौजूद नहीं है तो एक 404 लौटाएगा। आप अपने नियंत्रक में यह भी जांच सकेंगे कि $detail URL में date के साथ सुसंगत है। याद रखें: उपयोगकर्ता इनपुट पर कभी भरोसा न करें (इसमें URL शामिल हैं)।

और जब आप अपने दूसरे नियंत्रक पर रीडायरेक्ट करते हैं तो आप यह नया पैरामीटर प्रदान कर सकते हैं:

return $this->redirectToRoute("second_method", [
    "date" => $date,
    "id_detail" => $workspace->getId() // You can also pass the whole object and fetch the ID in the template
]);

फिर अपने टेम्पलेट में:

{{ path('first_method', {'id': id_detail}) }}

विवरण

ParamConverters के लिए आप यहां अधिक विवरण प्राप्त कर सकते हैं: https:/ /symfony.com/doc/current/bundles/SensioFrameworkExtraBundle/annotations/converters.html

मैं व्यक्तिगत रूप से एक Entity के रूपांतरण के लिए @Entity एनोटेशन पसंद करता हूं क्योंकि आप सुनिश्चित हैं कि रूपांतरण कैसे किया जाता है: जब आपकी परियोजना बढ़ती है और आपकी संस्थाओं में अधिक से अधिक पैरामीटर होते हैं तो मुझे यह बेहतर लगता है। हालांकि @ParamConverter आपके मामले में काम करेगा।

0
Diabetic Nephropathy 16 अक्टूबर 2020, 15:29

second_method रूट पैरामीटर को बदले बिना वैकल्पिक, केवल रेफरर पर निर्भर।

नियंत्रक में सहायक विधि जोड़ें:

/**
 * Returns the referer url to redirect back if the request came from first_method
 * Otherwise returns FALSE.
 */
private function getBackUrl(Request $request, UrlMatcherInterface $matcher)
{
    $referer = $request->headers->get('referer');
    if (null === $referer) {
        return false;
    }

    $url = parse_url($referer);
    if ($url['host'] != $request->getHost()) {
        return false;
    }

    // Remove the baseurl if we're in a subdir or there's no Rewrite
    $path = str_replace($request->getBaseUrl(), '', $url['path']);
    try {
        $route = $matcher->match($path);
    } catch (ResourceNotFoundException $e) {
        // Doesn't match any known local route
        return false;
    }

    // A route has been determined, check if it matches the requirement
    if ('first_method' == $route['_route']) {
        return $referer;
    }

    return false;
}

विधि को इसमें बदलें (Route एनोटेशन नहीं बदलता है, केवल विधि हस्ताक्षर):

public function secondMethod($date, Request $request, UrlMatcherInterface $matcher)
{
    return $this->render('second-method.html.twig', [
        'someData' => $someData,
        'date' => $date,
        'back_url' => $this->getBackUrl($request, $matcher),
    ]);
}

आपके टेम्पलेट में:

{# Show the button only if the request came from first_method (otherwise will be false) #}
{% if back_url %}
     <a class="btn" href="{{ back_url }}">Return</a>
{% endif %}
0
msg 17 अक्टूबर 2020, 18:58