Perl 在Mojolicious中,什么是放置内容协商逻辑的最佳位置?

Perl 在Mojolicious中,什么是放置内容协商逻辑的最佳位置?,perl,mojolicious,Perl,Mojolicious,我的Mojolicious应用程序只能通过json或html进行响应 当请求不同格式时,我想用415不支持的媒体类型状态代码进行响应 $c->render( text => 'We support only HTML and JSON', status => 415 ) 哪一个地方是最好的逻辑 UPD $c->respond_to( json => {template => 'hello', data => $data }, html =&g

我的
Mojolicious
应用程序只能通过
json
html
进行响应

当请求不同格式时,我想用
415不支持的媒体类型
状态代码进行响应

$c->render( text => 'We support only HTML and JSON',  status => 415 )
哪一个地方是最好的逻辑

UPD

$c->respond_to(
  json => {template => 'hello', data => $data },
  html => {template => 'hello', data => $data },
  any  => {text => 'We support only HTML and JSON', status => 415}
);
hello
模板由许多操作呈现。我不想在所有操作中复制/粘贴此代码片段。我更喜欢:

$c->render( 'hello',  data => $data );
$c->render( 'hello', data => $data );
它将自动选择
hello.json.ep
hello.html.ep
模板之一

我将使用hook和
接受
帮助程序来确定所请求的格式,但不幸的是,每个
静态
文件都会调用它。静态响应已经被调度,这将是无用的工作


那么,在路由钩子之前使用
可以吗?或者有更好的地方可以这样做吗?

要在处理JSON和HTML之后添加响应,请向处理程序添加
任何
响应。这样,它与所有其他接受/响应处理逻辑位于同一位置

$c->respond_to(
  json => {json => {hello => 'world'}},
  html => {template => 'hello', message => 'world'},
  any  => {text => 'We support only HTML and JSON', status => 415}
);
我不想在所有操作中复制/粘贴此代码段。我更喜欢:

$c->render( 'hello',  data => $data );
$c->render( 'hello', data => $data );
它将自动选择
hello.json.ep
hello.html.ep
模板之一

听起来您可能需要补充
$c->render
的行为,因为您的控制器及其操作的唯一共同代码是框架代码

您可以使用专门的
呈现
(缺少更好的名称)扩展创建
您的::Mojo::Controller
模块。一般来说,我会看看
render
是如何实现的,特别是我想在
render
中介绍:

my ($output, $format) = $app->renderer->render($self, $args);
这个
$app->renderer
是一个应用程序,它的文档同时包含和:

自定义控制器可能类似于:

package Your::Mojo::Controller;
use Mojo::Base -base;

sub render_either {
    my $self = shift;
    my $template = shift;
    my $args = {@_};

    # Let the renderer know which formats it should accept.
    # Let the renderer know which template to render in which format.
    # Either call $self->render or reproduce its behavior.
}

我已经看到了
使用Mojo::Base-Base的例子
使用Mojo::Base'Mojolicious::Controller。我也不确定选择的含义。

在每个操作中使用相同的代码是非常低效的。此外,这将禁用基于
{format}
@EugenKonkov的自动模板选择在什么意义上有效?您没有对其进行基准测试,我不知道您将使用什么度量(时间、内存、响应时间等)。从必须打字的意义上讲,效率高吗?您希望如何在没有键入的情况下指定它?我已经更新了问题。我在我的两个模板中键入,不需要在所有十(百?)个操作中键入,我完全理解您的要求,希望您找到比使用sed/awk的大规模应用更好的解决方案;但是,在本例中,您似乎是在反对该框架。祝你好运好的,但是使用这种方法,似乎您必须有效地插入内容协商代码,而不是处理它的地方。简言之,我不确定您的代码是否真的更有效,因为它必须检查请求、查找并扫描相应的
respond\u to
块,以查看它是否被显式处理(除非您在维护这样一个解决方案时要做出难以取消的假设)。效率不仅体现在调度中,还体现在它能够在不降低效率的情况下解决您的问题。@EdwinBuck:对不起,我不是指速度效率。我的意思是很难维护那些
复制/粘贴
代码。我理解。在我看来,你最好是复制/粘贴。一旦你的框架进入了主动维护阶段,如果有人没有意识到你已经有效地重写了框架的这一部分,那么无论你在“代码维护”方面有什么低效之处,你都会立即失去安全性。不使用fork框架很好,而且您只需要一个find/sed组合,就可以将页面配置为不具有JSON处理程序(或具有3个非回退处理程序),从而远离处理代码的大规模应用程序。