Search code examples
phpsymfonygetparameter-passinginternal-server-error

Symfony Pass parameters to method using GET Type


I am using php symfony version 3.4 - GET method to call a method with parameters but I am getting the following error.

service call : http://localhost/myworkspace/AMSCMS/web/app_dev.php/sse/server/events/get?data=1 

method :
/**
     * @Rest\Get("/server/events/get")
     */
    public function getServerEventsGetAction($dt) {
        try {   
            if($dt == 1){
                header('Content-Type: text/event-stream');
                header('Cache-Control: no-cache');
                $time = date('r');
                echo "data: The server time is: {$time}\n\n";
                flush();    
            }                   
        } catch ( Exception $ex ) {
            $result = $display->getJsonException($ex);
        }

    }

Error :
    {"error":{"code":500,"message":"Internal Server Error","exception":[{"message":"Controller \"AppBundle\\Controller\\ServerEventsController::getServerEventsGetAction()\" requires that you provide a value for the \"$dt\" argument. Either the argument is nullable and no null value has been provided, no default value has been provided or because there is a non optional argument after this one.","class":"RuntimeException","trace":[{"namespace":"","short_class":"","class":"","type":"","function":"","file":"C:\\xampp\\htdocs\\myworkspace\\ApartmentManagementSystem\\ApartmentManagementScms\\vendor\\symfony\\symfony\\src\\Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver.php","line":78,"args":[]},{"namespace":"Symfony\\Component\\HttpKernel\\Controller","short_class":"ArgumentResolver","class":"Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver","type":"->","function":"getArguments","file":"C:\\xampp\\htdocs\\myworkspace\\ApartmentManagementSystem\\ApartmentManagementScms\\vendor\\symfony\\symfony\\src\\Symfony\\Component\\HttpKernel\\Controller\\TraceableArgumentResolver.php","line":38,"args":[["object","Symfony\\Component\\HttpFoundation\\Request"],["array",[["object","AppBundle\\Controller\\ServerEventsController"],["string","getServerEventsGetAction"]]]]},{"namespace":"Symfony\\Component\\HttpKernel\\Controller","short_class":"TraceableArgumentResolver","class":"Symfony\\Component\\HttpKernel\\Controller\\TraceableArgumentResolver","type":"->","function":"getArguments","file":"C:\\xampp\\htdocs\\myworkspace\\ApartmentManagementSystem\\ApartmentManagementScms\\vendor\\symfony\\symfony\\src\\Symfony\\Component\\HttpKernel\\HttpKernel.php","line":143,"args":[["object","Symfony\\Component\\HttpFoundation\\Request"],["array",[["object","AppBundle\\Controller\\ServerEventsController"],["string","getServerEventsGetAction"]]]]},{"namespace":"Symfony\\Component\\HttpKernel","short_class":"HttpKernel","class":"Symfony\\Component\\HttpKernel\\HttpKernel","type":"->","function":"handleRaw","file":"C:\\xampp\\htdocs\\myworkspace\\ApartmentManagementSystem\\ApartmentManagementScms\\vendor\\symfony\\symfony\\src\\Symfony\\Component\\HttpKernel\\HttpKernel.php","line":68,"args":[["object","Symfony\\Component\\HttpFoundation\\Request"],["integer",1]]},{"namespace":"Symfony\\Component\\HttpKernel","short_class":"HttpKernel","class":"Symfony\\Component\\HttpKernel\\HttpKernel","type":"->","function":"handle","file":"C:\\xampp\\htdocs\\myworkspace\\ApartmentManagementSystem\\ApartmentManagementScms\\vendor\\symfony\\symfony\\src\\Symfony\\Component\\HttpKernel\\Kernel.php","line":200,"args":[["object","Symfony\\Component\\HttpFoundation\\Request"],["integer",1],["boolean",true]]},{"namespace":"Symfony\\Component\\HttpKernel","short_class":"Kernel","class":"Symfony\\Component\\HttpKernel\\Kernel","type":"->","function":"handle","file":"C:\\xampp\\htdocs\\myworkspace\\ApartmentManagementSystem\\ApartmentManagementScms\\web\\app_dev.php","line":29,"args":[["object","Symfony\\Component\\HttpFoundation\\Request"]]}]}]}}

Solution

  • you don't get the GET params as action parameters, you need to get those via the Request object:

    public function getServerEventsGetAction(Request $request) {
        $dt = $request->get('data');
        // ... check that $data is not null etc
    }
    

    or alternatively you can change the parameter to be included in the url (instead of GET param) and that way you can access it normally as action parameter like your controller does:

    /**
     * @Rest\Get("/server/events/get/{dt}")
     */
    

    and use url in this format:

    http://localhost/myworkspace/AMSCMS/web/app_dev.php/sse/server/events/get/1