php / symfony:检索POST / PUT api的url中的属性

For a datatable I use in a page (webix datatable), I have to use a REST API.

My url is for example: http://localhost:8000/trial/1

In this page to make the api call I use the following:

save: "rest->{{ path('api_i_post') }}",
url: "rest->{{ path('erp_interventionapi_get', { trialid: trial.id })

With the GET method, I retrieve for a trial (/trial/1), many interventions which are loaded from a database and filled in the datatable.

With this datatable, I'm able to "add a new row". It uses the POST method (save: "rest->{{ path('api_i_post') }}")

When I add a new row, I'd like to be able to get the field trial_id filled in automatically, depending from where I add a new row in the datatable (for /trial/1, trial_id = 1) but I don't know how to retrieve this attribute (or the trial object id), in a POST and a PUT.

My postAction:

/**
 * @Rest\Post("/api_i/", name="api_i_post")
 */
public function postAction(Request $request)
{
    $data = new Intervention;
    $id = $request->get('id');
    $action = $request->get('action');
    $daadala = $request->get('daadala');
    $date = $request->get('date');
    $week = $request->get('week');
    $infopm = $request->get('info_pm');
    $comment = $request->get('comment');
    $location = $request->get('location');
    $trial = $request->get('trialid');

    $data->setAction($action);
    $data->setDaadala($daadala);
    $data->setDate($date);
    $data->setWeek($week);
    $data->setWho($infopm);
    $data->setInfoPm($comment);
    $data->setComment($location);
    $data->setTrial($trial);

    $em = $this->getDoctrine()->getManager();
    $em->persist($data);
    $em->flush();

    $lastid = $data->getId();

    $response=array("id" => $id, "status" => "success", "newid" => $lastid);
    return new JsonResponse($response);

    $view = View::create(array("newid" => $lastid, "id" => $id, "status" => "success"));
    return $this->handleView($view);

}

And my putAction

    /**
 * @Rest\Put("/api_i/{id}")
 */
public function putAction(Request $request)
{
    $data = new Intervention;
    $id = $request->get('id');
    $action = $request->get('action');
    $daadala = $request->get('daadala');
    $date = $request->get('date');
    $week = $request->get('week');
    $infopm = $request->get('info_pm');
    $comment = $request->get('comment');
    $location = $request->get('location');
    $sn = $this->getDoctrine()->getManager();
    $intervention = $this->getDoctrine()->getRepository('ErpBundle:Sponsor')->find($id);

    if (empty($intervention)) {
        return new View("Sponsor not found", Response::HTTP_NOT_FOUND);
    }
    $intervention->setAction($action);
    $intervention->setDaadala($daadala);
    $intervention->setDate($date);
    $intervention->setWeek($week);
    $intervention->setWho($infopm);
    $intervention->setInfoPm($comment);
    $intervention->setComment($location);
    $sn->flush();

    $response=array("id" => $id, "status" => "success");

    return new JsonResponse($response);
}

Can you help me with this issue?

Thank you very much

Update of my code after the replys:

I have update this in my twig template:

save: "rest->{{ path('api_i_post', { trialid: trial.id }) }}",

If I look in the profiler of the ajax request, I see it is here:

Key Value

trialid "1"

But I still don't figure how to get it in my post request (the trial_id is still null right now)

I've tried the following:

    /**
 * @Rest\Post("/api_i/", name="api_i_post")
 * @Rest\RequestParam(name="trialid")
 *
 * @param ParamFetcher $paramFetcher
 * @param Request $request
 */
public function postAction(Request $request, ParamFetcher $paramFetcher)
{
    $data = new Intervention;
    $id = $request->get('id');
    $action = $request->get('action');
    $daadala = $request->get('daadala');
    $date = $request->get('date');
    $week = $request->get('week');
    $infopm = $request->get('info_pm');
    $comment = $request->get('comment');
    $location = $request->get('location');
    $trial = $paramFetcher->get('trialid');

    $data->setAction($action);
    $data->setDaadala($daadala);
    $data->setDate($date);
    $data->setWeek($week);
    $data->setWho($infopm);
    $data->setInfoPm($comment);
    $data->setComment($location);
    $data->setTrial($trial);

    $em = $this->getDoctrine()->getManager();
    $em->persist($data);
    $em->flush();

    $lastid = $data->getId();

    $response=array("id" => $id, "status" => "success", "newid" => $lastid);
    return new JsonResponse($response);

    $view = View::create(array("newid" => $lastid, "id" => $id, "status" => "success"));
    return $this->handleView($view);

}

To get post value you need to do this inside your post action:

public function postAction(Request $request)
{
     $postData = $request->request->all();

Then you have an array of value like:

$id = $postData['id'];

For the PUT you need this:

public function putAction(int $id, Request $request)
{
    $putData = json_decode($request->getContent(), true);

And then to treieve a value like this:

$id = $putData['id'];

I guess you are using the FosRestBundle, if so, you can use annotations to retrieve your url parameters :

/**
 * @Rest\Put("/api_i/{id}", requirements={"id" = "\d+"})
 */
public function putAction($id)
{
    // you now have access to $id
    ...
}

If you want to allow additionnal parameters for your route but not in the uri, you can use RequestParam with annotations :

/**
 * @Rest\Put("/my-route/{id}", requirements={"id" = "\d+"})
 *
 * @Rest\RequestParam(name="param1")
 * @Rest\RequestParam(name="param2")
 *
 * @param ParamFetcher $paramFetcher
 * @param int $id
 */
public function putAction(ParamFetcher $paramFetcher, $id)
{
    $param1 = $paramFetcher->get('param1');
    ....
}

Be sure to check the fosRestBundle documentation to see everything you can do (such as typing the params, making them mandatory or not, etc...)