Hallo,Definieren Sie eine benutzerdefinierte ExceptionStrategy in einem ZF2 Modul
Ich habe seit mehr als einer Woche mit diesem Problem zu kämpfen und schließlich beschlossen, um Hilfe zu bitten Hoffnung, dass jemand die Antwort kennt.
Ich entwickle eine Anwendung, die Google's Protocol Buffers als das Datenaustauschformat verwendet. Ich verwende DrSlumps PHP implementation, mit dem Sie Klasseninstanzen mit Daten füllen und sie dann in eine binäre Zeichenfolge serialisieren (oder binäre Zeichenfolgen in PHP-Objekte decodieren).
Ich habe es geschafft, meine Gewohnheit zu implementieren ProtobufStrategy
deren selectRenderer(ViewEvent $e)
gibt eine Instanz von ProtobufRenderer
falls das Ereignis eine Instanz von ProtobufModel
enthält. Der Renderer extrahiert dann meine benutzerdefinierten Parameter aus dem Modell, indem er $model->getOptions()
aufruft, um zu bestimmen, welche Nachricht an den Client zurückgesendet werden muss, serialisiert die Daten und gibt die Binärzeichenfolge an php: // output aus.
Denn es mehr Sinn machen, die auf der folgenden Beispielnachricht sehen lassen:
message SearchRequest {
required string query = 1;
optional int32 page_number = 2;
optional int32 result_per_page = 3;
}
Wenn ich an den Client mit dieser Nachricht antworten wollte, habe ich so etwas wie dies aus meiner Handlung zurückkehren würde:
public function getSearchRequestAction()
{
[..]
$data = array(
'query' => 'my query',
'page_number' => 3,
'result_per_page' => 20,
);
return new ProtobufModel($data, array(
'message' => 'MyNamespace\Protobuf\SearchRequest',
));
}
Wie man sehen kann ich unter Verwendung ViewModel
‚s zweiten Parameter, Optionen $, zu sagen, welcher Nachricht serialisiert werden muss. Dies kann dann, wie bereits erwähnt, innerhalb des Renderers durch Aufruf von $model->getOptions()
extrahiert werden.
So weit, so gut. Meine Controller-Aktionen geben binäre Daten wie erwartet aus.
Allerdings habe ich Probleme mit der Behandlung von Ausnahmen. Mein Plan war, alle Ausnahmen zu fangen und mit einer Instanz meiner Ausnahme Nachricht an den Client antworten, die wie folgt aussieht:
message Exception {
optional string message = 1;
optional int32 code = 2;
optional string file = 3;
optional uint32 line = 4;
optional string trace = 5;
optional Exception previous = 6;
}
In der Theorie sollte es aus der Box arbeiten, aber es funktioniert nicht. Das Problem ist, dass Zend\Mvc\View\Http\ExceptionStrategy::prepareExceptionViewModel(MvcEvent $e)
eine Instanz ViewModel
zurückgibt, die offensichtlich nicht die zusätzlichen Informationen enthält, die ich brauche.
Es gibt auch ViewModel
und nicht ProtobufModel
, was bedeutet, dass der Zend den Standard aufruft und die Ausnahme als eine HTML-Seite ausgibt.
Was ich tun möchte, ist ersetzen den Standard ExceptionStrategy
(und schließlich auch die RouteNotFoundStrategy
) mit eigenen Klassen, die so etwas wie diese Rückkehr würden:
$data = array(
'message' => $e->getMessage(),
'code' => $e->getCode(),
'file' => $e->getFile(),
'line' => $e->getLine(),
'trace' => $e->getTraceAsString(),
'previous' => $e->getPrevious(),
);
return new ProtobufModel($data, array(
'message' => 'MyNamespace\Protobuf\Exception',
));
... und ich kann‘ t finden den Weg, es zu tun ...
ich habe versucht, meine eigene ExceptionStrategy
Klasse erstellt und alias an den bestehenden ExceptionStrategy Service aber Zend darüber beschwert, dass ein Dienst mit diesem Namen existiert bereits.
Ich habe den Verdacht, dass ich auf dem richtigen Weg mit der benutzerdefinierten Strategieerweiterung bin Ich kann keinen Weg finden, um den Standard zu überschreiben.
Ich habe festgestellt, dass der Standard ExceptionStrategy
und die Konsole eins in Zend/Mvc/View/Http/ViewManager
registriert werden. Ich hoffe, ich muss keine benutzerdefinierten Ansichts-Manager hinzufügen, um eine so einfache Sache zu erreichen, aber bitte korrigiere mich, wenn ich falsch liege.
Jede Hilfe wird geschätzt!
Herzlichen Glückwunsch zu einer gut geschriebenen, gut recherchierten Frage! – markus