4

Symfony 注释模块中有什么东西可以让我将它们用于其他用途吗?

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

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

:这里有一个 HTML5 带注释的标题或某些属性是否有意义?如果能够在已经存在的路线名称和内容旁边定义这些数据,就像注释一样,那就太好了。

Q之前有没有人对注释进行过调整?

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

有一些 SPA 前端通过前端包集成,并且通过 AJAX 调用连接到后端包,这是一个直接的 RESTful API,并添加了一个非常有趣的开发 PHP API 类 I以直接执行其他 PHP 类控制器“方法”的方式解释和处理(路由)AJAX。

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

好的,所以回到正轨;鉴于上述情况;在路由器的 JS 类对象端,在这里面我认为这是添加一些 JS History API 功能的最佳位置,(状态,后退按钮等)

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

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

现在我们可以在数据库和实时客户端异步之间来回传递状态两种方式。您可以从前端使用观察者或任何东西,并在后端使用作业/队列来保持其完全反应性。(也使用 React :-))

编辑我不太确定这就是我的想法,看起来它让我在 PHP 函数的 return 语句中设置titleand的值url,我希望在注释中设置它(参见 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那么看看这两个代码示例,我如何连接两者之间的点以使其工作?

4

2 回答 2

7

是的,您可以注释类,您可以按照以下教程创建自定义注释类

基本规则如下:

  • 你的班级应该有@Annotation-phpdoc 注释

    /**
     * @Annotation
     */
    class CustomAnnotation
    {
        public function __construct($options) {}
    }
    
  • 在您需要的课程中,只需以标准方式使用它;

    class Person
    {
        /**
         * @CustomAnnotation("option")
         */
        public function getName()
        {
            return 'some stuff';
        }
    }
    
于 2015-03-17T09:18:58.833 回答
0

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

于 2015-03-17T08:21:35.313 回答