bla*_*amb 4 routing annotations symfony html5-history popstate
Symfony注释模块中有什么东西允许我将它们用于其他用途吗?
我知道@Route,@Method你需要扩展现有的库,所以它不是那么容易我猜.
目前,我正在使用JS History API,并且很乐意将popState我的JS文件的数据放在注释中.因此,当路由生成URL时,它们已经可用.
问:这里有一个HTML5带注释的标题或某个属性是否有意义?能够在已经存在的路由名称和内容旁边定义注释的数据是很棒的.
问:之前是否有人使用过注释进行了调整?
我想澄清我的意图,因为我认为我遗漏了一些关键细节(提到历史API)来理解我的用例.
有一些SPA前端通过前端捆绑集成,这通过AJAX调用连接到后端捆绑,这是一个直接的RESTful API,增加了一个非常有趣的开发PHP API类我使得以直接执行其他PHP类控制器方法的方式对AJAX进行解释和处理(路由).
我在这个Symfony 2应用程序(fosjsrouter)中使用了很多ajax来处理路由.因此,SPA点击事件不是触发路由和动作的URL,而是将AJAX触发到后端路由器,具有大的JSON有效负载,不限于PHP控制参数(类/方法/ var名称)和数据集.
好的,所以回到正轨; 鉴于上述情况; 在路由器的JS类对象端,我认为这是向它添加一些JS History API功能的最佳位置,(状态,后退按钮等)
如果调用了一个history标志,则可以调用上述类,该标志可能负责分配初始状态数据.首先,这是因为在这个JS方法中存在的JSON数据对象已经包含了很多关键的路由数据,以及后端PHP中需要的那条路由的param信息,它来自注释.
所以我的想法是,如果我将历史状态标题和URL的可访问性添加到注释中,那么我将可以访问那些可用于定义初始状态的信息,如果已标记,则ajax.done()在该主要JS路由方法中的an 内部.
现在我们可以在db和实时客户端异步之间来回传递状态两种方式.您可以使用前端的观察者或任何内容,以及后端的作业/队列,以使其完全被动.(也使用React :-))
编辑我不太确定这就是我的想法,看起来它让我在PHP函数的return语句中设置了这个title和的值url,我希望它在注释中设置(参见返回'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;
}
}
Run Code Online (Sandbox Code Playgroud)
我想把它设置回这里,所以调用这条路线的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));
}
}
Run Code Online (Sandbox Code Playgroud)
问:看看这两个代码示例,我如何连接两者之间的点以使其工作?
是的,您可以使用注释类,您可以按照以下教程创建自定义注释类
基本规则如下:
你的类应该有@Annotation-phpdoc注释
/**
* @Annotation
*/
class CustomAnnotation
{
public function __construct($options) {}
}
Run Code Online (Sandbox Code Playgroud)在您需要的课程中,只需以标准方式使用它;
class Person
{
/**
* @CustomAnnotation("option")
*/
public function getName()
{
return 'some stuff';
}
}
Run Code Online (Sandbox Code Playgroud)