Come iniettare istanze Java in script PHP eseguiti a livello programmatico utilizzando Quercus
Domanda
Ho un codice simile a questo:
QuercusEngine engine = new QuercusEngine();
Value value = engine.execute("<?php return $obj->getName(); ?>");
System.out.println(value);
.
(vedi http://wiki.caucho.com/quercus:_command_line_interface_(Cli) per maggiori informazioni)
Voglio impostare $obj
come istanza Java.Qualcosa del genere:
SomeObject someObject = new SomeObject();
engine.setParam("obj", someObject);
.
Ovviamente questo è un esempio semplicistico ma il punto è che voglio essere in grado di utilizzare le istanze delle classi Java che sono già state istanziate nello script PHP.Come potrei fare questo?
Soluzione
Non penso che questo sia documentato da nessuna parte, ma dopo aver visto attraverso il codice sorgente, guardando ciò che il Quercusengine stava facendo, e un piccolo processo ed errore è quello che serve:
Path path = new StringPath("<?php return $obj->getName(); ?>");
QuercusContext quercusContext = new QuercusContext();
ReadStream reader = path.openRead();
QuercusProgram program = QuercusParser.parse(quercusContext, null, reader);
WriteStream out = new WriteStream(StdoutStream.create());
QuercusPage page = new InterpretedPage(program);
Env env = new Env(quercusContext, page, out, null, null);
SomeObject someObj = new SomeObject();
JavaClassDef classDef = env.getJavaClassDefinition(someObject.getClass());
env.setGlobalValue("obj", new JavaValue(env, someObject, classDef));
Value value = NullValue.NULL;
try {
value = program.execute(env);
}
catch (QuercusExitException e) {
}
out.flushBuffer();
out.free();
System.out.println(value);
.
Spero che questo aiuti qualcuno.Ho testato questo in Quercus 4.0.25.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow