我可以轻松实现自己的 Symfony2 注释吗?

Can I implement my own Symfony2 annotations easily?

Symfony 注释模块中是否有任何允许我将它们用于其他用途的东西?

我知道 @Route@Method 你需要扩展现有的库,所以我猜这并不容易。

目前,我正在使用 JS 历史 API,并且很乐意将我的 JS 文件的 popState 数据放在注释中。因此当路由生成 URL 时它们已经可用。

Q 在这里设置 HTML5 带注释的标题或某些属性是否有意义?如果能够在已经存在的路线名称和内容旁边定义此数据(如注释),那将是很棒的。

Q 有没有人之前修改过注释?

我想在这里阐明我的意图,因为我认为我遗漏了一些关键细节(提到历史 API)以理解我的用例。

有一些 SPA 前端已通过 front-end 捆绑包集成,并且通过 AJAX 调用连接到后端捆绑包,后者是直接 RESTful API,加上一个非常 fun-to-develop PHP API class 我使解释和处理(路由) AJAX 的方式直接执行其他 PHP class 控制器`方法。

我为这个 Symfony 2 应用程序 (fosjsrouter) 使用了很多 ajax 来处理路由。因此,不是 URLs 触发路由和操作,而是 SPA click 事件触发 AJAX 到后端路由器,负载很大 JSON,不限于 PHP控制参数(class/method/var 名称)和数据集。

好的,回到正轨;鉴于上述情况;在路由器的 JS class object 端,我认为这是向其添加一些 JS 历史 API 功能的最佳位置,(状态、后退按钮等)

如果调用了 history 标志,则可以调用上面的 class,这可能会负责分配初始状态数据。这主要是因为此 JS 方法中的 JSON 数据 object 已经包含了很多关键的路由数据,以及后端所需的该路由的参数信息 PHP,来自注释。

所以我的想法是,如果我为历史状态标题添加可访问性并为注释添加 URL,那么我将有权访问该信息,以定义初始状态(如果已标记),就在内部ajax.done(),在这个主要的 JS 路由方法中。

现在我们可以在数据库和实时 client-side 异步之间以两种方式来回传递状态。您可以在后端使用 front-end 和 jobs/queues 中的观察者或任何东西,以保持其完全反应。 (也使用 React :-))

编辑 我不太确定那是我的想法,看起来它让我设置了 titleurl 的值为此,在 PHP 函数的 return 语句中,我希望在注释中设置它(参见 return 'Matthias Noback';

所以我正在尝试这个,但是我应该在哪里设置这些标题?

    <?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;
    }
}

我想把它设置回到这里,所以调用这条路线的 ajax 可以访问它..(在这段代码中寻找 @historyApiTitle 等等)

<?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 那么看看这两个代码示例,我如何连接两者之间的点以使其工作?

您应该查看 AOPBundle,它允许您根据个人注释进行处理。但我不认为尝试在视图中做注释是个好主意。您需要用 php 解析 javascript,这听起来很糟糕。

是的,你可以注释 classes 你可以按照以下教程进行操作 Creating Custom annotations Classes

基本规则如下:

  • 您的 class 应该有 @Annotation -phpdoc 评论

    /**
     * @Annotation
     */
    class CustomAnnotation
    {
        public function __construct($options) {}
    }
    
  • 在您需要的时候class只需按标准方式使用即可;

    class Person
    {
        /**
         * @CustomAnnotation("option")
         */
        public function getName()
        {
            return 'some stuff';
        }
    }