2016-09-06 1 views
0

Я использую пакет композитора zf-rest в моем проекте.

Это метод create в моем файле ресурсов.

public function create($data) 
{ 
    var_dump($e->getRouteMatch()->getParams()); 
    // all URL params are listed here with the correct values 
    die(); 
} 

Мы продлили RestController к CustomRestController и добавил

'controller_class' => CustomRestController::class 

в конфигурационном файле.

В настоящее время var_dump($event->getRouteMatch()); является null внутри классов ресурсов.

public function onBootstrap(MvcEvent $e) В, используя

$eventManager->attach(
    MvcEvent::EVENT_ROUTE, 
    function($e) { 
     // I can still read `$e->getRouteMatch()->getParams()` 
    } 
); 

Любое предложение о том, как справиться с этим очень ценится.

ответ

0

Обновленный ответ:

Проблема корень RestParametersListener. Она использует FQCNs как:

$listener = $events->attach(
    RestController::class, 
    // more params 
); 

Таким образом расширяя RestController причины этих attach/detach вызовы, чтобы избежать нового контроллера.

Чистое исправление должно было продлить RestParametersListener до CustomRestParametersListener и изменить классы контроллеров внутри.

После расширения этого, я также добавил его в module.config.php:

'service_manager' => [ 
    'invokables' => [ 
     'ZF\Rest\RestParametersListener' => CustomRestParametersListener::class, 
    ], 
    // ... 
] 

Первоначальный ответ:

нашел обходной путь до вопросов 102 и 103 получают фиксированную в ZF- rest dev team

В моих CustomRestController:

try { 
    $this->manuallyInjectRouteMatch(); // added this line 
    $value = $this->getResource()->create($data); 
} catch (Throwable $e) { 
    return $this->createApiProblemFromThrowable($e); 
} catch (Exception $e) { 
    return $this->createApiProblemFromException($e); 
} 

Где:

/** 
* By using this factory instead of the default one and by creating a CastorRestController 
* instead of RestController, the routeMatch property is "lost". 
* Manually injecting it so we have access to it inside the *Resource class 
*/ 
private function manuallyInjectRouteMatch() 
{ 
    $r = new \ReflectionProperty(Resource::class, 'routeMatch'); 
    $r->setAccessible(true); 
    $r->setValue($this->getResource(), $this->getEvent()->getRouteMatch()); 
} 

Кроме того, manuallyInjectRouteMatch должен быть вызван для других методов REST, а