我可以轻松实现自己的 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 :-))
编辑 我不太确定那是我的想法,看起来它让我设置了 title
和 url
的值为此,在 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';
}
}
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 :-))
编辑 我不太确定那是我的想法,看起来它让我设置了 title
和 url
的值为此,在 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'; } }