【问题标题】:Can I implement my own Symfony2 annotations easily?我可以轻松实现自己的 Symfony2 注释吗?
【发布时间】:2015-05-19 07:56:09
【问题描述】:

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

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

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

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

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

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

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

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

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

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

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

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

编辑我不太确定这是我的想法,看起来它让我在 PHP 的 return 语句中为此设置了 titleurl 的值函数,我希望它在注释中设置(见返回'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;
    }
}

我想在此处将其设置为 WAY,以便调用此路由的 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那么看看这两个代码示例,我如何连接两者之间的点以使其工作?

【问题讨论】:

  • 鹅,我不能使用 historyAPI stackoverflow-tag,因为我没有 1000 个代表,而且我喜欢回答问题,但只在这里找到适合我经验的未回答问题一个月,我猜我永远不会到达那里,即使我是一个 15 年以上的全栈开发人员.....
  • 我不确定我是否理解得很好,但是您想使用 js 数据在 twig 中生成路由吗?
  • no, ok 我怎样才能让这个更清楚对不起,我想在 php 文件的注释部分添加我自己的自定义行,这样当 js 文件引用注释时,我可以那里有一个自定义条目用于填充其中一个 js 变量,这有意义吗?

标签: symfony routing annotations html5-history popstate


【解决方案1】:

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

【讨论】:

  • 感谢您对此的建议,它看起来很复杂,特别是考虑到我只需要一种方便的方法来在应用程序中携带一个已经存在的变量,所以如果可行的话,我不会在其他任何地方有重复的代码。我认为也许注释可以做到这一点,但这一个打破了银行。无论如何谢谢。
【解决方案2】:

是的,你可以注释类你可以按照下面的教程Creating Custom annotations Classes

基本规则如下:

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

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

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

【讨论】:

  • 我认为你一针见血,我会看看这个并报告,谢谢!
  • 是的,完全正确!所以我将添加另外两个注释,@historyTitle@historyUrl,也许即使正确地简要阅读了文档,如果需要,我也可以添加 @historyState,并以这种方式传递整个对象?哇。我不知道我是否也想这样做,可能太不正统了..
  • 看你的例子,它看起来很简单,所以只需按名称添加类,类名将成为注释名称......我想知道这是否是我可能放的特殊情况一个文件上有两个类,我绝对不会把它放在更大的底部,但也许放在所需类的顶部?不确定 symfony 是否会让你这样做。另外,我希望我只需要一个类,用于所有未来的注释,而不是一个,我认为这会变得很麻烦。
  • 并请在那里查看我的编辑。我还有一些问题,如果我能得到一些帮助来弄清楚这个注释模块,那就太好了
  • 有人可以分享这个问题的爱吗?它把你带到了这里:-)
猜你喜欢
  • 1970-01-01
  • 2014-01-19
  • 2020-07-27
  • 1970-01-01
  • 2012-03-14
  • 1970-01-01
  • 2011-06-19
  • 2018-11-02
  • 2017-09-01
相关资源
最近更新 更多