Controller::Base::url_for: nur noch fragment erlauben
authorSven Schöling <s.schoeling@linet-services.de>
Thu, 15 Feb 2018 10:26:15 +0000 (11:26 +0100)
committerSven Schöling <s.schoeling@linet-services.de>
Thu, 15 Feb 2018 10:26:15 +0000 (11:26 +0100)
Mit mosu darüber gesprochen, und folgende Argumente kamen:

* Es ist unschön dass quasi magische Elemente wie controller, action und
  jetzt hash und fragment in einer flachen Argumentliste übergeben
  werden. Das ist aber historisch gewachsen und wird jetzt nicht
  geändert. Ziel sollte es aber sein, dass potentielle Kollisionen
  selten passieren.

* fragemnt ist die offizielle Bezeichnung für den #... Anteil einer URI.
  Blöderweise nennt Javascript das document.location.hash, und so ist
  das im Gedächtnis geblieben. Da aber hash eh schon in Perl und
  Programmieren extrem überladen ist mit Bedeutungen ist fragment hier
  der etwas weniger miese Begriff.

SL/Controller/Base.pm

index d10ba80..5847b98 100644 (file)
@@ -29,7 +29,7 @@ sub url_for {
   my %params      = ref($_[0]) eq 'HASH' ? %{ $_[0] } : @_;
   my $controller  = delete($params{controller}) || $self->controller_name;
   my $action      = $params{action}             || 'dispatch';
-  my $fragment    = delete $params{hash} // delete $params{fragment} // '';
+  my $fragment    = delete $params{fragment};
 
   my $script;
   if ($controller =~ m/\.pl$/) {
@@ -42,7 +42,7 @@ sub url_for {
 
   my $query       = join '&', map { uri_encode($_->[0]) . '=' . uri_encode($_->[1]) } @{ flatten(\%params) };
 
-  return "${script}?${query}" . ($fragment ? "#$fragment" : '');
+  return "${script}?${query}" . (defined $fragment ? "#$fragment" : '');
 }
 
 sub redirect_to {
@@ -529,6 +529,9 @@ L</controller_name>.
 The action to call is given by C<$params{action}>. It defaults to
 C<dispatch>.
 
+If C<$params{fragment}> is present, it's used as the fragment of the resulting
+URL.
+
 All other key/value pairs in C<%params> are appended as GET parameters
 to the URL.