Диспетчеризация с Catalyst в FastCGI под Apache
Я учу себя Катализатор. Я бы очень хотел организовать свое приложение с несколькими контроллерами и несколькими действиями в каждом, и, возможно, попробовать цепочки, но я не уверен, как заставить это работать в моих конкретных настройках.
У меня есть полный контроль над компьютером, на котором работает внешний сервер FastCGI, но у меня нет доступа к компьютеру, на котором работает Apache. Единственный способ, которым я могу "настроить" сервер, - это отправить заявку в службу поддержки, спросив "Не могли бы вы, ребята, попробовать добавить эти две строки в конфигурацию Apache?" И надеяться на лучшее.
Пока что я попросил их попробовать эту конфигурацию:
Alias /myapp/ /tmp/myapp.fcgi
FastCgiExternalServer /tmp/myapp.fcgi -host myserver:3010
Но, конечно, это работает, если кто-то подключается к http://theirserver/myapp
, но я не могу использовать http://theirserver/myapp/controller/action/etc
с этой конфигурацией.
Итак, вот мой многочастный вопрос:
Есть ли простой способ настроить Apache таким образом, чтобы я мог использовать лучшую диспетчеризацию, и, возможно, даже цепочки - т.е. не иметь
Alias
для каждого возможного контроллера - действие?Если это невозможно, это означает, что доступен только запрос. Какова наилучшая практика для отправки запроса в Catalyst при таких обстоятельствах?
1 ответ
Я нашел то, что для меня является приемлемым решением, но я все еще ищу лучшие практики в конфигурации Apache или диспетчеризации Catalyst-as-external-FastCGI. В любом случае, ответьте на вопрос, если вы знаете лучший способ!
Модуль Catalyst::ActionRole::QueryParameter
позволяет обрабатывать запросы на основе параметров запроса. Я был в состоянии использовать его для создания контроллера, который выглядит следующим образом:
package MyApp::Controller::Root;
use Moose;
use namespace::autoclean;
BEGIN { extends 'Catalyst::Controller::ActionRole'; }
__PACKAGE__->config(
namespace => '',
action_roles => ['QueryParameter'],
);
sub default :Path {
my ( $self, $c ) = @_;
$c->response->body('no action specified!');
}
sub login :Path :QueryParam('action:eqlogin') {
my ( $self, $c ) = @_;
$c->response->body('login')
}
sub logout :Path :QueryParam('action:eqlogout') {
my ( $self, $c ) = @_;
$c->response->body('logout')
}
__PACKAGE__->meta->make_immutable;
1;
Можно даже использовать какие-то цепочки, как показано в приведенном примере приложения, хотя это нигде не кажется столь же удовлетворительным, как то, о чем я читал в руководстве.
На момент написания этого, сравнение строк не работает в этом модуле, поэтому использование этого решения, вероятно, означает применение небольшого патча к QueryParameter.pm
, как предлагается в этом сообщении об ошибке.