php - Ajax errors on services since 2.4: custom event + request scope -
since upgraded symfony 2.1 2.4, i'm faced quite unexpected error. speculate on reasons why happens:
[2014-03-24 10:32:19] emergency.emergency: uncaught exception 'symfony\component\dependencyinjection\exception\inactivescopeexception' message 'you cannot create service ("form.type.daterange") of inactive scope ("request").' in d:\users\abousquet\workspace\eportal\app\cache\dev\appdevdebugprojectcontainer.php:1231 stack trace: #0 d:\users\abousquet\workspace\eportal\app\bootstrap.php.cache(2033): appdevdebugprojectcontainer->getform_type_daterangeservice() #1 d:\users\abousquet\workspace\eportal\app\cache\dev\classes.php(1842): symfony\component\dependencyinjection\container->get('form.type.dater...') #2 d:\users\abousquet\workspace\eportal\app\cache\dev\classes.php(1807): symfony\component\eventdispatcher\containerawareeventdispatcher->lazyload('resources.autol...') #3 d:\users\abousquet\workspace\eportal\vendor\symfony\symfony\src\symfony\component\httpkernel\debug\traceableeventdispatcher.php(106): symfony\component\eventdispatcher\containerawareeventdispatcher->getlisteners(null) #4 d:\users\abousquet\workspace\eportal\vendor\symfony\sy {"type":1,"file":"d:\\users\\abousquet\\workspace\\eportal\\app\\cache\\dev\\appdevdebugprojectcontainer.php","line":1231} []
the error triggered in dev whenever try access page using ajax. triggered after page rendered (the action of controller completes correctly , error happens afterwards). makes hard hell understand when error spawns.
the service form.type.daterange custom form type registered event subscriber. here service definition:
<service id="form.type.daterange" class="eportal\corebundle\form\daterangetype" scope="request"> <argument type="service" id="calendar.conf.reader" /> <tag name="form.type" alias="daterange" /> <tag name="kernel.event_subscriber" /> </service>
this service registered on custom event resources.autoload triggered in main controller before page rendered - never when using ajax pages.
as logs put it, seems request service not available @ time service requested. when , why hell requested ? seems me removing mysterious call solve problem.
the error not pop if unsubscribe event registration or if widen scope. believe combination of custom event + request scope @ source of issue.
when prevent error on form.type.daterange, other service, registered on same event same scope, fails instead. coding error inside class seems unlikely me.
last fun fact: error triggers on pages when none of these failing services used.
edit:
code custom event triggered. override of render() method:
abstract class htmlcontrollerabstract extends corecontrollerabstract { ... public function render($view, array $parameters = array(), response $response = null) { $event = new filtercontrollerevent( $this->get('kernel'), array($this, 'render'), $this->getrequest(), httpkernelinterface::master_request ); $this->get('event_dispatcher')->dispatch(storeevents::resources_autoload, $event); $this->setreplacement('breadcrumb', $this->breadcrumb->getview()); $this->setreplacement('javascripts', $this->javascriptresources); $this->setreplacement('stylesheets', $this->cssresources); $this->setreplacement('see_also', $this->_getseealso()); return parent::render($view, $parameters, $response); } ... }
edit:
what works: removing 'request' scope services using custom event. no error logged i'm still worrying 2 consecutive pages treated same request service instance.
i still feel solution insatisfying though. there no clear reason why request scope should fail custom events.
accepted response:
as suspected, problem occured in hidden sub-call still cannot figure out of today. solution? solution provided manolo salsas right 1 in end, not know @ time these 2 loc should written. know, must in app/appkernel.php:
class appkernel extends kernel { ... public function registerbundles() { ... } public function registercontainerconfiguration(loaderinterface $loader) { ... } protected function initializecontainer() { parent::initializecontainer(); $this->getcontainer()->enterscope('request'); $this->getcontainer()->set('request', new \symfony\component\httpfoundation\request(), 'request'); } }
another solution applies in specific case, rid of request parameter form types crashed. since request used populate automatically of form options, solution populate these options manually, anywhere service subscribes custom event.
if want access request
object, can extend containeraware
and:
$this->getcontainer()->enterscope('request'); $this->getcontainer()->set('request', new request(), 'request');
Comments
Post a Comment