加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

在Perl Catalyst URL中用连字符替换下划线

发布时间:2020-12-16 06:25:38 所属栏目:大数据 来源:网络整理
导读:我们正在研究将CamelCase转换为驼峰和下划线到连字符的选项,并希望有人可以提供一些强有力的例子. (出于SEO原因使用连字符). 特别: 在Catalyst中使用MMORPG并厌倦了写这样的事情: sub travel_to ( $self,$c,$star ) : Path('travel-to') Args(1) { ... }
我们正在研究将CamelCase转换为驼峰和下划线到连字符的选项,并希望有人可以提供一些强有力的例子. (出于SEO原因使用连字符).

特别:

在Catalyst中使用MMORPG并厌倦了写这样的事情:

sub travel_to  ( $self,$c,$star ) : Path('travel-to') Args(1)  { ... }

或这个:

package Veure::Controller::Area::StorageLocker {
    ....
    sub index ( $self,$c ) : Path('/area/storage-locker') { ... }
}

更新:因为有一些混乱,我的意思是我们更愿意让开发者写这个:

# getting rid of Args() would be nice,but sigs don't have introspection
sub travel_to  ( $self,$star ) : Args(1)  { ... }

或这个:

package Veure::Controller::Area::StorageLocker {
    ....
    sub index ( $self,$c ) { ... }
}

这很重要,因为对于SEO的立场,下划线而不是连字符可以显着提高您的SEO.由于不得不做额外的粗暴工作以始终强制连字符,开发人员忘记这样做,我们不断浪费钱回去,不得不重写代码,忘记这个警告.这是我们应该能够自动完成的事情.

解决方法

我在Catalyst源代码中做了一些挖掘.

Cammel案件控制器名称

您可以在Catalyst::Utils中修改class2prefix以更改控制器名称转换为命名空间的方式.

这是一个非常快速的黑客,它演示了使用catalyst.pl创建的新MyApp所发生的事情.我借了Borodin’s suggestion来实现它.

package MyApp::Controller::FooBar;
use Moose;
use namespace::autoclean;
BEGIN { extends 'Catalyst::Controller'; }

{
    require Class::Method::Modifiers;
    require String::CamelCase;

    Class::Method::Modifiers::around(
        'Catalyst::Utils::class2prefix'  => sub {
            my $orig = shift;

            # I borrowed most of this from the original function ...
            my $class = shift || '';
            my $prefix = shift || 0;
            if ( $class =~ /^.+?::([MVC]|Model|View|Controller)::(.+)$/ ) {
                $prefix = $2;
                $prefix =~ s{::}{/}g;

                # ... and this from https://stackoverflow.com/a/37968830/1331451
                $prefix = String::CamelCase::decamelize($prefix) =~ tr/_/-/r;
            }

            return $prefix;
        }
    );
}

sub index :Path :Args(0) {
    my ( $self,$c ) = @_;
    $c->response->body('Matched MyApp::Controller::FooBar in FooBar.');
} 

1;

我对此进行了简要的测试,但不能保证它不会破坏其他任何东西.我相信如果把它放到一个更好的地方并以更合适的方式完成它可能是一个可行的选择.

强调行动

这个看起来比较棘手.我最好的选择是以某种方式摆弄Catalyst::DispatchType::Path,或创建一个安装修改它的ActionClass的东西.它基本上用 – 替换_.那个东西可以在gather_default_action_roles in Catalyst::Controller左右建立(可能作为一个子类),将其添加到所有操作中.这是高度投机的.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读