1package Mojolicious::Plugin::Mount; 2use Mojo::Base 'Mojolicious::Plugin'; 3 4use Mojo::Server; 5 6sub register { 7 my ($self, $app, $conf) = @_; 8 9 my $path = (keys %$conf)[0]; 10 my $embed = Mojo::Server->new->load_app($conf->{$path})->secrets($app->secrets)->log($app->log); 11 12 # Extract host 13 my $host; 14 ($host, $path) = ($1 ? qr/^(?:.*\.)?\Q$2\E$/i : qr/^\Q$2\E$/i, $3) if $path =~ m!^(\*\.)?([^/]+)(/.*)?$!; 15 16 my $route = $app->routes->any($path)->partial(1)->to(app => $embed); 17 return $host ? $route->requires(host => $host) : $route; 18} 19 201; 21 22=encoding utf8 23 24=head1 NAME 25 26Mojolicious::Plugin::Mount - Application mount plugin 27 28=head1 SYNOPSIS 29 30 # Mojolicious 31 my $route = $app->plugin(Mount => {'/prefix' => '/home/sri/foo/script/foo'}); 32 33 # Mojolicious::Lite 34 my $route = plugin Mount => {'/prefix' => '/home/sri/myapp.pl'}; 35 36 # Adjust the generated route and mounted application 37 my $example = plugin Mount => {'/example' => '/home/sri/example.pl'}; 38 $example->to(message => 'It works great!'); 39 my $app = $example->pattern->defaults->{app}; 40 $app->config(foo => 'bar'); 41 $app->log(app->log); 42 43 # Mount application with host 44 plugin Mount => {'example.com' => '/home/sri/myapp.pl'}; 45 46 # Host and path 47 plugin Mount => {'example.com/myapp' => '/home/sri/myapp.pl'}; 48 49 # Or even hosts with wildcard subdomains 50 plugin Mount => {'*.example.com/myapp' => '/home/sri/myapp.pl'}; 51 52=head1 DESCRIPTION 53 54L<Mojolicious::Plugin::Mount> is a plugin that allows you to mount whole L<Mojolicious> applications. 55 56The code of this plugin is a good example for learning to build new plugins, you're welcome to fork it. 57 58See L<Mojolicious::Plugins/"PLUGINS"> for a list of plugins that are available by default. 59 60=head1 METHODS 61 62L<Mojolicious::Plugin::Mount> inherits all methods from L<Mojolicious::Plugin> and implements the following new ones. 63 64=head2 register 65 66 my $route = $plugin->register(Mojolicious->new, {'/foo' => '/some/app.pl'}); 67 68Mount L<Mojolicious> application and return the generated route, which is usually a L<Mojolicious::Routes::Route> 69object. 70 71=head1 SEE ALSO 72 73L<Mojolicious>, L<Mojolicious::Guides>, L<https://mojolicious.org>. 74 75=cut 76