Permets aux differentes applications d'avoir un proxy vers conversation-api
Modifier composer.json
:
{
// ...
"require": {
"etna/conversation-proxy-provider": "~1.0.x"
},
"repositories": [
{
"type": "composer",
"url": "http://blu-composer.herokuapp.com"
}
]
}
Le composant etna/config-provider
met à disposition une classe permettant de faire utiliser ce proxy a notre application.
Lors de la configuration de l'application il faut donc utiliser la classe ETNA\Silex\Provider\Config\ConversationProxy
:
use ETNA\Silex\Provider\Config as ETNAConf;
class EtnaConfig implements ServiceProviderInterface
{
public function register(Application $app)
{
...
//L'utilisation du controlleur custom est expliquée plus bas
$my_controller = new ConversationController();
$app->register(new ETNAConf\ConversationProxy($my_controller));
...
}
}
Ce provider met a disposition un DumbMethodsProxy
qui fournit toutes les routes basiques de conversations :
- Likes
- Message
- Views
- Recherche
Il est possible de creer un controlleur qui hérite de ce DumbMethodsProxy
pour rajouter des routes custom :
class ConversationController extends DumbMethodsProxy
{
public function connect(Application $app)
{
//Si il y'a besoin des routes basiques
$controllers = parent::connect($app);
//Sinon
$controllers = $app["controllers_factory"];
$controllers->get("/contract/{contract_id}/conversation", [$this, 'getConversation']);
$controllers->post("/contract/{contract_id}/conversation", [$this, 'createConversation']);
}
public function getConversation(Application $app, $contract_id)
{
$conversation = $app["conversations"]->findOneByQueryString("+contract_id:{$contract_id} +app-name:gsa");
return $app->json($conversation->toArray(), 200);
}
public function createConversation(Application $app, $contract_id)
{
$conversation = new Conversation();
$conversation->setTitle("GSA - Contract {$contract_id}");
$response = $app["conversations"]->save($conversation);
return $app->json($response, 201);
}
}
Ce provider met a disposition :
- L'objet Conversation, qui est une "entité" qui se comporte comme une entité doctrine le ferait
- On peut la remplir avec un array grace a
$conversation->fromArray($array)
- On peut la serializer en array grace a
$conversation->toArray()
- L'objet ConversationManager ($app["conversations"]) qui lui se comporte comme l'entity manager de doctrine, sauf qu'il permet aussi de recuperer des conversations. Il met a disposition les methodes :
findByQueryString
qui prends en parametre une query string ElasticSearch (+contract_id:42 +app-name:gsa) et qui retourne un tableau de ConversationsfindOneByQueryString
qui prends aussi en parametre une query string mais retourne l'objet le plus pertinentsave
qui prend en paramètre une Conversation et effectue les requetes necessaires pour sauvegarder les changements