在Perl Catalyst URL

时间:2016-06-22 12:52:51

标签: perl catalyst

我们正在研究将CamelCase转换为camel-case的选项,并将其强调为连字符,并希望有人可以提供一些强有力的示例。 (出于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, $c, $star ) : Args(1)  { ... }

或者这个:

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

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

2 个答案:

答案 0 :(得分:3)

我在Catalyst源代码中进行了一些挖掘。

Cammel案件控制器名称

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

这是一个非常快速的黑客,它演示了使用 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的东西。它基本上用_替换- thing 可以围绕gather_default_action_roles in Catalyst::Controller(可能作为子类)构建,以将其添加到所有操作中。 这是高度投机的

答案 1 :(得分:2)

CPAN具有String::CamelCase模块,该模块提供if (driver.find_elements(:class_name,'example').size > 0) puts 'ELEMENT FOUND' else puts 'NOT FOUND' end 功能,之后您需要使用decamelize

将下划线转换为连字符

我希望这个简短的例子有助于回答你的问题

tr/_/-/

输出

use strict;
use warnings 'all';
use v.14.1;

use String::CamelCase 'decamelize';

for my $s ( 'travel_to', 'Veure::Controller::Area::StorageLocker' ) {
    (my $ss = $s) =~ s|^[\w:]*::Controller(?=::)||;
    $ss =~ s|::|/|g;
    $ss = decamelize($ss) =~ tr/_/-/r;
    say $ss;
}