ArangoDB & Symfony Integration: Part 4 Guide | ArangoDB ’13
You can download the completed demo at Github.
Extending Arangodb\Document
The next thing we want to improve are all those noisy set calls in the controller:
// src/Triagens/ArangodbBundle/Controller/DefaultController.php
if ($form->isValid()) {
$movie = new ArangoDocument();
$movie->set("title",$form->get("title")->getData());
$movie->set("released",$form->get("released")->getData());
$movie->set("genre",$form->get("genre")->getData());
// and so on ... my eyes hurt!
}
The fix is pretty obvious. $movie is an instance of triagens\ArangoDb\Document and we can extend it.
//src/Triagens/ArangodbBundle/Entity/Movie.php
namespace Triagens\ArangodbBundle\Entity;
use triagens\ArangoDb\Document;
class Movie extends Document
{
/**
* assign each value of $values to movie
*/
public function populate($values)
{
if (!is_array($values)) {
throw new \InvalidArgumentException("values is expected to be an array");
}
foreach ($values as $key => $value) {
$this->set($key, $value);
}
}
}
The final add action
We have now moved the conversion of the topic list between the form representation (string) and our app data representation (array) to a data transformer (Symfony feature). We have also extended Arangodb\Document to get rid of the set methods in the controller. Now our code looks like this:
// src/Triagens/ArangodbBundle/Controller/DefaultController.php
use Triagens\ArangodbBundle\Entity\Movie;
/**
* @Route("/add/")
* @Template
*/
public function addAction()
{
$connection = $this->get('mop_arangodb.default_connection');
$documentHandler = new DocumentHandler($connection);
$form = $this->createForm(new AddmovieType());
$request = $this->get('request');
if ($request->isMethod('POST')) {
$form->bind($request);
if ($form->isValid()) {
// bind ArangoDB document with values submitted by the user
$movie = new Movie();
$movie->populate($form->getData());
$documentHandler->save($this->_getCollectionName(), $movie);
$this->get('session')->getFlashBag()->add('success', "New movie was successfully added.");
return new RedirectResponse($this->generateUrl('triagens_arangodb_default_list'));
}
}
return array(
'form' => $form->createView()
);
}
Using ArangoDB query language
The last example in this tutorial shows how you can use ArangoDB’s query language which can also handle very complex queries (AQL manual)
The AQL query to search for the topic “romance” looks like this:
FOR m in movies FILTER "romance" in m.topics RETURN m
Our tiny “search for topic” feature in PHP gets the wanted topic from the search form (not shown here, but you can look it up in the code repository on Github). You have to bind it to the statement as you would do with many other database layers, execute it. Done.
// src/Triagens/ArangodbBundle/Controller/DefaultController.php
use triagens\ArangoDb\Statement as Statement;
/**
* @Route("/search")
* @Template
*/
public function searchAction()
{
$connection = $this->get('mop_arangodb.default_connection');
$form = $this->createForm(new SearchType());
$request = $this->get('request');
if ($request->isMethod('POST')) {
$form->bind($request);
if ($form->isValid()) {
// create, bind parameter and execute Arangodb Query language statement (AQL)
$statement = new Statement($connection, array(
"query" => '',
"count" => true,
"batchSize" => 1000,
"_sanitize" => false,
));
$statement->setQuery("FOR m in `" . $this->_getCollectionName() . "` FILTER @term in m.topics RETURN m");
$statement->bind("term", $form->get("search")->getData());
$cursor = $statement->execute();
return $this->render(
'TriagensArangodbBundle:Default:list.html.twig',
array(
'movies' => $cursor->getAll()
)
);
}
}
return array("form" => $form->createView());
}
ArangoDB and Doctrine
We are currently discussing if the community would like a ArangoDB integration into Doctrine. We would love to hear your thoughts in the comments, via twitter, google group, mail, whatever … you’ll find a way 🙂
The end
Congrats, you have reached of the last part of the tutorial.
- Symfony 2 & ArangoDB – part 1: setup and getting a connection
- Symfony 2 & ArangoDB – part 2: data modelling & fetching a list from the DB
- Symfony 2 & ArangoDB – part 3: working with forms & data transformers
- Symfony 2 & ArangoDB – part 4: extending ArangoDB Document & querying via AQL
2 Comments
Leave a Comment
Get the latest tutorials, blog posts and news:
my question may be not matter with this post . just want to know if use arangoDb as a php sessionHandler , how can i delete the session data that expired !
if use the mogodb or mysql to store the session data, we can use such statement to remove the expired data: db.session.remove( { expire: { $gt :} } )
or the sql : delete from tbl_session where expire<:expire
I just want to know how this can be implemented in arangodb . 🙂
this answer have settled on stackoverflow : http://stackoverflow.com/questions/21982328/is-it-possible-implement-php-session-handler-with-arangodb/21982925?noredirect=1#21982925
thx all of you !