- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有这个 Controller :
/**
* {@inheritdoc}
*
* @Route("entity/{domain_host}")
* @ParamConverter("entity", class="AppBundle:Entity", options={
* "repository_method" = "findOneByDomainHost",
* "mapping": {"domain_host": "domainHost"},
* "map_method_signature" = true
* })
*/
class EntityController extends Controller
{
...
}
通过这种方式,像 http://example.com/entity/another-example.com
这样的 URL 与操作和相应的 another-example.com
相匹配实体被水合并传递给 Controller 。
现在,这个实体也有一个 ID。
我想拦截像 http://example.com/entity/12345
这样的 URL 并将其重定向到 http://example.com/entity/another-example .com
.
为此,我在 EntityController
中创建了另一个方法:
/**
* {@inheritdoc}
*
* @Route("entity/{domain_host}")
* @ParamConverter("store", class="AppBundle:Entity", options={
* "repository_method" = "findOneByDomainHost",
* "mapping": {"domain_host": "domainHost"},
* "map_method_signature" = true
* })
*/
class EntityController extends Controller
{
public function redirectIdToDomainAction(Request $request)
{
die(dump($request));
// Following will be the redirect logic
}
}
在我的 routing.yml
中,在文件的顶部:
entity_id_to_domain:
path: /entity/{id}
defaults: { _controller: AppBundle:Entity:redirectIdToDomain }
requirements:
id: ^[^.]*$
methods: [GET]
实际上,如果占位符不包含点,则调用 redirectIdToDomain
操作(点是区别:如果占位符有一个点,则传递一个域,如果没有点,占位符可能代表 uts ID 的实体,我必须重定向)。
问题是,当 Controller 类 EntityController
使用 @ParamConverter
时,占位符被解释为一个域,结果是我得到一个 AppBundle:找不到实体对象。
。
那么,有没有办法只在占位符有一个点时应用@ParamConverter
?或者,我可以使用哪些其他方法来使 redirectToIdAction
工作而不会引发 Not found
异常?
最佳答案
自定义的 ParamConverter 可能可以解决问题,但如果您不想制作一个,则必须对 ID 和域名使用不同的路由。
由于您的路由是在整个类上完成的,而不是在操作本身上完成的,恐怕您将不得不将重定向操作移至另一个 Controller 类。
之后可以根据需求选择性匹配ID和域名
/**
*@Route(
"entity/{domain_host}",
name="entity_domain",
requirements={"domain_host": "^(?=.*[\w])(?=.*[.]).+$"}
*)
*@ParamConverter(...)
*/
someActionOnDomainAction()
{
//...
}
/**
*@Route(
"entity/{id}",
name="entity_domain",
requirements={"id": "^[\d]$"}
*)
*/
redirectIdToDomainAction()
{
//...
}
或者,您可以将存储库方法 findOneByDomainHost()
更改为类似 findOneByDomainHostOrID()
的方法,并使其匹配域名和数字 ID。
通过这种方式,您可以解决 Object Not Found
错误,并且您始终可以获取实体的域名,并在同一 Controller 操作中进行重定向。
这是一个例子:
/**
* Class EntityController
*
* @Route("/entity/{domain_host}", name="domain_host")
* @ParamConverter("domain_host", class="AppBundle:Entity", options={
* "repository_method" = "findOneByHostOrID"
* })
*/
class EntityController extends Controller
{
/**
* @Route("/", name="show_domain_host")
* @param Entity $domain_host
*/
public function domain_hostAction(Entity $domain_host, Request $request)
{
$id = $domain_host->getId();
$host = $domain_host->getHost();
// Get the unconverted route parameter.
$parameter = $request->attributes->get('_route_params')['domain_host'];
if ($parameter == $domain_host->getId()){
// If the route parameter matches the ID,
// redirect to the same route using the domain host.
$url = $this->generateUrl('show_mail', ['mail' => $lib]);
return $this->redirect($url, 301);
}
return new Response("<html><body>$id $host</body></html>");
}
}
和存储库类:
class EntityRepository extends EntityRepository
{
public function findOneByHostOrID($domain_host)
{
if (preg_match("[\\d]",$domain_host)) {
return $this->findOneById($domain_host);
} else {
return $this->findOneByHost($domain_host);
}
}
}
关于php - Symfony @ParamConverter : exclude the use if the placeholder does not contain a dot,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40845380/
我有这样的情况: ids = [None, None, None] foo = Foo.objects.filter(common=True).exclude(id__in=ids) 这似乎总是排除所
我创建了一个简单的测试目录: ├── backup.tgz ├── Dummy-dir │ ├── dummy-file-a.txt │ ├── dummy-file-b.txt │ ├─
有了这个 persistence.xml : org.eclipse.persistence.jpa.PersistenceProvider osgi:s
我正在使用 powershell 更新索引策略,但它默认在排除路径中添加 "path": "/\"_etag\"/?" 属性我希望索引策略是 { "indexingMode": "consis
我正在使用 Django 查询从表中过滤掉一些事务,其中一个事务可能在表中有多个条目。 例如示例表 +---------------+---------+ | TransactionId | Stat
我使用 eclipselink 作为 JPA 提供程序,并且需要将实体保存在 jar 文件中。所有 jar 实体都用 @Entity 进行注释。我尝试了 false 和 true 但它没有自动检测实体
这是 Ignore files in git log -p 的后续行动也与Making 'git log' ignore changes for certain paths有关. 我正在使用 Git
我在 Android Studio 中导入了一个库项目,但我无法排除一个组,因为当 compile 指令位于包含的项目中时,gradle 找不到那个 exclude 方法方法? 它可以找到以下方法的排
我正在使用 gitbash 和 git 版本 2.20.1.windows.1。 commit , diff , branch一切正常,但 git status (当然是最基本的命令?)失败。错误信息
假设最开始的命令是这样的 rsync -e 'ssh -p 30000' -avl --delete --stats --progress demo@123.45.67.890:/home/demo
我有一个我想忽略的日期列表: private val excludeDates = List( new DateTime("2015-07-17"),
我有一个这样的表: DESC mytable id | parent 1 | 2 2 | null 3 | null 4 | null 5 | 3 ... | ... 3种条目:
首先,这是我的代码: Bill: 它应该像这样工作: 当我点击“搜索”时,URL 应更改为 "shpapp01/Web/Public.html#/PublicWeb/Tracking/Searc
我继承了一堆C#代码。对于几个方法定义,我找到了 ///作为它前面唯一的 XMLDoc。我试图用谷歌搜索它的含义,但没有成功。有人可以解释一下这可能意味着什么吗? 最佳答案 在NDoc至少,这意味着应
我在将单个目录从远程机器复制到本地时遇到问题。 这是我使用的命令: rsync -chavzP --stats --exclude='/var/www/html/px3' root@IPHERE:/v
我有一个从 1 到 100 的数组: array=$(seq 100) 我的任务是排除 60 到 80 的范围。 最佳答案 您可以将参数扩展与偏移/长度规范一起使用。 #! /bin/bash arr
背景 我一直在使用 Exclude和 Extract实用程序类型,但遇到过我只想匹配确切类型而不是子类型的情况。 到目前为止 我已经成功创建了一个 StrictExtract只提取完全匹配的类型的实用
我在 Windows 上,使用 Subersive 运行 Eclipse Indigo 以连接到 远程 svn 仓库。 我有一个项目 check out 到本地文件夹。项目中有一些目录我想从 chec
我正在 Django 中创建一个稀疏的首选项表。我的模型很简单: class Preference(models.Model): user = models.ForeignKey(settin
我有一个 tar/gzip 文件,我正在使用 ansible unarchive 模块提取到主机列表。 以下是configs.tgz的部分内容列表: -rw-rw-r-- ian/ian
我是一名优秀的程序员,十分优秀!