Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can I implement my own Symfony2 annotations easily?

Is there anything in the Symfony annotations modules that allow me to use them for other uses?

I know for @Route and @Method you need to extend existing libraries, so its just not that easy i'm guessing.

Currently, i'm working with the JS History API, and would LOVE to put the popState data for my JS files in the annotations. So they are already available when the routing generates the URL.

Q Doesn't this makes sense to have a, HTML5 annotated title, or some attribute here? It would be great to have the ability to define this data, as annotated, right next to the already existing route name and stuff.

Q Is there anybody that has tweaked with the annotations before?

I wanted to clarify my intentions here as I think I left out some crucial details (the mention of History API) for understanding my use case.

There is a few SPA front ends that have been integrated through a front-end bundle, and this connected via AJAX calls to a backend bundle which was a straight RESTful API, with the addition of a very fun-to-develop PHP API class I made that intereprets and processes (routes) the AJAX in a fashion that directly executes other PHP class controller `methods.

I use a lot of ajax for this Symfony 2 app (fosjsrouter) to handle routing. So instead of URLs triggering the routes and actions, the SPA click event fires off AJAX to the back end router, with a large JSON payload, not limited to PHP control parameter's (class/method/var names), and data sets.

OK, so getting back on track; Given the above scenario; In the JS class object end of the router, inside this I thought it was the best place to add some JS History API functionality to it, (state, back button, etc.)

The above class can be called if a history flag was called, which could become responsible for assigning initial state data. Primarily, this is because the JSON data object that's being around in this JS method contains already a lot of the crucial route data, and param information for that route needed in the backend PHP, which comes from the annotations.

So the idea is if I add accessibility for a history state title and URL to the annotations, then I will have access to that information right there available to define the initial state, if flagged, right inside the an ajax.done(), inside this main JS routing method.

Now we can pass state back and forth two ways between the db and realtime client-side async. You can use an observer, or anything, from there front-end, and jobs/queues on the backend to keep it fully reactive. (use React too :-))

EDIT I'm not so sure that's what I was thinking, it looks like its making me set the values of the title and url for this inside the return statement of the PHP function, where I want it set in the annotation (see return 'Matthias Noback';)

So I'm trying this, but where do I set these titles at?

    <?php

namespace Blah\CoreBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;

/**
 * @Annotation
 */
class HistoryAnnotationController
{

    //history state params are out properties here..
    /**
     * @var
     */
    private $url;

    /**
     * @var
     */
    private $title;


    /**
     *
     */
    public function __construct()
    {

    }

    /**
     * @return mixed
     */
    public function getTitle()
    {
        return $this->title;
    }

    /**
     * @return mixed
     */
    public function getUrl()
    {
        return $this->url;
    }
}

I want to set it WAY back here, so the ajax that calls this route has access to it.. (look for @historyApiTitle in this code, etc..)

<?php

namespace Blah\Bundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller,
    Symfony\Component\HttpFoundation\JsonResponse,
    Sensio\Bundle\FrameworkExtraBundle\Configuration\Method,
    Sensio\Bundle\FrameworkExtraBundle\Configuration\Route,
    Sensio\Bundle\FrameworkExtraBundle\Configuration\Template,
    Blah\Bundle\Entity\Test,
    Doctrine\ORM\Query; //for hydration

class StuffController
{
    /**
     * @Route("/some/route/name/{test}", name="some_route_name", options={"expose"=true})
     * @param $test
     * @return mixed
     * @historyApiTitle('This is the get something page')
     * @historyApiUrl('/get_something')
     */
    public function getSomethingAction($test)
    {

        $em = $this->getDoctrine()->getManager();

        $dql = "
            SELECT s
            FROM BlahBundle:Stuff s
            WHERE s.test = :test";

        $query = $em->createQuery($dql);
        $query->setParameter('test', $test);
        $paginator = $this->get('knp_paginator');

        $pagination = $paginator->paginate($query,
            $this->get('request')->query->get('page', 1), 1000);

        return $this->render('BlahBundle:Stuff:get_something.html.twig', array('pagination' => $pagination));
    }
}

Q So looking at these TWO code examples, how do I connect the dots between the two to get this to work?

like image 589
blamb Avatar asked Mar 16 '23 17:03

blamb


1 Answers

Yes you can annotations classes you can follow the following tutorial Creating Custom annotations Classes

Basic rules are the follows:

  • Your class should have the @Annotation -phpdoc comment

    /**
     * @Annotation
     */
    class CustomAnnotation
    {
        public function __construct($options) {}
    }
    
  • In Your Needed class just use it in standard way;

    class Person
    {
        /**
         * @CustomAnnotation("option")
         */
        public function getName()
        {
            return 'some stuff';
        }
    }
    
like image 120
Alexandru Olaru Avatar answered Mar 26 '23 21:03

Alexandru Olaru