Документация Perl 5

Mojolicious


НАЗВАНИЕ

Mojolicious - Веб в коробке!

ОБЗОР

  # Приложение Mojolicious 
  package MyApp;
  use Mojo::Base 'Mojolicious';
     
  sub startup {
    my $self = shift;
     
    # Маршруты
    my $r = $self->routes;
     
    # Маршрут по умолчанию
    $r->route('/:controller/:action/:id')->to('foo#welcome');
  }
     
  # Mojolicious контроллер
  package MyApp::Foo;
  use Mojo::Base 'Mojolicious::Controller';
     
  # Приветствие 
  sub welcome {
    my $self = shift;
    $self->render_text('Привет!');
  }
     
  # Попрощаемся используя шаблон (foo/bye.html.ep)
  sub bye { shift->render }

ОПИСАНИЕ

На заре развития всемирной паутины, многие люди изучали Perl потому, что существовала прекрасная библиотека Perl, называемая CGI. Она была достаточно проста, чтобы начать работу без особого знания языка и достаточно мощна, чтобы с увлечением продолжать изучать язык. Хотя большинство используемых ею методов в настоящее время устарело, сама идея остается актуальной. Mojolicious — новая попытка реализации этой идеи c использованием передовых технологий.

Возможности

  • Великолепный веб-фреймворк MVC позволяет написать полноценное приложение в одном файле с помощью Mojolicious::Lite.

    Мощные возможности прямо из коробки: маршруты RESTful, расширения, шаблонизация в стиле Perl, управление сеансом, подписанные cookies, тестировочный фреймворк, сервер статических файлов (static file server), I18N, первоклассная поддержка Юникода и многое другое!

  • Очень чистый, портируемый и объектно-ориентированный Perl API без какой-либо скрытой магии и требований, кроме Perl 5.8.7.(хотя рекомендуются версии 5.12+)

  • Полная поддержка HTTP 1.1 и клиент/серверная реализация WebSocket с IPv6, TLS, Bonjour, Comet (длинные опросы (анг. long polling)), поддержка chunking и multipart.

  • Встроенный неблокирующий веб-сервер(анг. non-blicking I/O web server) с поддержкой libev и "горячей" развёртки — прекрасно подходят для встраивания!

  • Автоматическое определение CGI, FastCGI и PSGI.

  • JSON и HTML5/XML парсер с поддержкой CSS3-селекторов.

  • Свежий код, основанный на многолетнем опыте разработки Catalyst.

Установка

Все что нужно, это одна строчка, это занимает меньше минуты.

  $ sudo sh -c "curl -L cpanmin.us | perl - Mojolicious"

Приступая к работе

Эти три строки образуют цельное веб-приложение.

  use Mojolicious::Lite;
     
  get '/' => {text => 'Hello World!'};
     
  app->start;

Чтобы запустить этот пример со встроенным development веб-сервером, просто вставьте код в файл и выполните его с morbo.

  $ morbo hello.pl
  Server available at http://127.0.0.1:3000.
     
  $ curl http://127.0.0.1:3000/
  Hello World!

Изолента для HTML5.

Веб-разработка для людей, делающая сложные вещи возможными, а саму разработку приятной.

  use Mojolicious::Lite;
     
  # Простой маршрут с обычным текстовым отображением
  get '/' => sub {
    my $self = shift;
    $self->render_text('Hello World!');
  };
     
  # Маршрут, ассоциирующий "/time" URL с шаблоном в секции DATA
  get '/time' => 'clock';
     
  # RESTful веб-сервис отправки ответов в формате JSON
  get '/list/:offset' => sub {
    my $self = shift;
    $self->render_json({list => [0 .. $self->param('offset')]});
  };
     
  # Сбор и возврат информации из удаленных сайтов
  post '/title' => sub {
    my $self = shift;
    my $url  = $self->param('url') || 'http://mojolicio.us';
    $self->render_text(
      $self->ua->get($url)->res->dom->html->head->title->text);
  };
     
  # Сервис ответов WebSocket
  websocket '/echo' => sub {
    my $self = shift;
    $self->on_message(sub {
      my ($self, $message) = @_;
      $self->send_message("echo: $message");
    });
  };
     
  app->start;
  __DATA__
     
  @@ clock.html.ep
  % use Time::Piece;
  % my $now = localtime;
  <%= link_to clock => begin %>
    Текущее время <%= $now->hms %>.
  <% end %>

Развитие

Простые прототипы файлов могут легко перерасти в хорошо структурированные приложения. Контроллер собирает несколько отдельных операций вместе.

  package MyApp::Example;
  use Mojo::Base 'Mojolicious::Controller';
     
  # Обычный текст ответа
  sub hello {
    my $self = shift;
    $self->render_text('Hello World!');
  }
     
  # Выдача внешнего шаблона "templates/example/clock.html.ep"
  sub clock { }
     
  # RESTful веб-сервис отправки ответов в формате JSON
  sub restful {
    my $self = shift;
    $self->render_json({list => [0 .. $self->param('offset')]});
  }
     
  # Сбор информации с удаленных сайтов
  sub title {
    my $self = shift;
    my $url  = $self->param('url') || 'http://mojolicio.us';
    $self->render_text(
      $self->ua->get($url)->res->dom->html->head->title->text);
  }
     
  1;

Пока класс приложения является уникальным, вы можете иметь столько контроллеров, сколько вам хочется.

  package MyApp::Realtime;
  use Mojo::Base 'Mojolicious::Controller';
     
  # WebSocket echo service
  sub echo {
    my $self = shift;
    $self->on_message(sub {
      my ($self, $message) = @_;
      $self->send_message("echo: $message");
    });
  }
     
  1;

Большие приложения получают преимущество от разделения действий от маршрутов, особенно при работе в команде.

  package MyApp;
  use Mojo::Base 'Mojolicious';
     
  # Выполняется один раз при запуске приложения
  sub startup {
    my $self = shift;
    my $r    = $self->routes;
     
    # Создание маршрута в "/example" для контроллера "MyApp::Example"
    my $example = $r->route('/example')->to('example#');
     
    # Соединение этих HTTP GET маршрутов с действиями в контроллере
    # (пути соответствуют контроллеру)
    $example->get('/')->to('#hello');
    $example->get('/time')->to('#clock');
    $example->get('/list/:offset')->to('#restful');
     
    # Все общие HTTP операции поддерживаются
    $example->post('/title')->to('#title');
     
    # ... и многое, многое другое
    # (в том числе несколько автоматически обнаруживаемых контроллеров)
    $r->websocket('/echo')->to('realtime#echo');
  }
     
  1;

Через все эти изменения, ваш код операции и шаблоны могут оставаться почти теми же самыми.

  % use Time::Piece;
  % my $now = localtime;
  <%= link_to clock => begin %>
    Текущее время <%= $now->hms %>.
  <% end %>

Mojolicious был разработан с нуля для удобного и уникального рабочего процесса

Хотите знать больше?

Взгляните на нашу отличную документацию Mojolicious::Guides!

АРХИТЕКТУРА

Слабо связанные функциональные блоки, используйте те, что вам нравятся и просто не обращайте внимания на остальные.

    .---------------------------------------------------------------.
    |                                                               |
    |                .----------------------------------------------'
    |                | .--------------------------------------------.
    |   Application  | |              Mojolicious::Lite             |
    |                | '--------------------------------------------'
    |                | .--------------------------------------------.
    |                | |                 Mojolicious                |
    '----------------' '--------------------------------------------'
    .---------------------------------------------------------------.
    |                             Mojo                              |
    '---------------------------------------------------------------'
    .-------. .-----------. .--------. .------------. .-------------.
    |  CGI  | |  FastCGI  | |  PSGI  | |  HTTP 1.1  | |  WebSocket  |
    '-------' '-----------' '--------' '------------' '-------------'

АТРИБУТЫ

Mojolicious наследует все атрибуты из Mojo и реализует следующие.

controller_class

    my $class = $app->controller_class;
    $app      = $app->controller_class('Mojolicious::Controller');

Класс который будет использоваться в качестве контроллера, по умолчанию используется Mojolicious::Controller.

mode

    my $mode = $app->mode;
    $app     = $app->mode('production');

Режим работы для вашего приложения, по умолчанию используется значение переменной окружения MOJO_MODE или development. Вы можете также добавить режим логики приложения, определяя методы с именем $mode_mode в классе приложения, которые будут вызываться до срабатывания startup.

  sub development_mode {
    my $self = shift;
    ...
  }
     
  sub production_mode {
    my $self = shift;
    ...
  }

Прямо перед вызовом startup и специфическими методами режима, Mojolicious будет перехватывать текущий режим, имя файла лога после него и поднимать уровень лога из debug в info, если он имеет значение, отличное от development.

on_process

  my $process = $app->on_process;
  $app        = $app->on_process(sub {...});

Функция обратного вызова, обрабатывающая запросы, по умолчанию вызывает метод dispatch. Обычно вы будете использовать плагин или контроллер вместо него, рассматривайте его как лом в вашем наборе инструментов.

  $app->on_process(sub {
    my ($self, $c) = @_;
    $self->dispatch($c);
  });

plugins

    my $plugins = $app->plugins;
    $app        = $app->plugins(Mojolicious::Plugins->new);

Загрузчик плагина по умолчанию — объект Mojolicious::Plugins. Обычно вы можете оставить всё как есть, см. Mojolicious::Plugin, если хотите написать плагин.

renderer

    my $renderer = $app->renderer;
    $app         = $app->renderer(Mojolicious::Renderer->new);

Используется для визуализации контента, по умолчанию Mojolicious::Render. Два основных плагина визуализации Mojolicious::Plugin::EpRenderer и Mojolicious::Plugin::EplRenderer содержат более подробную информацию.

routes

    my $routes = $app->routes;
    $app       = $app->routes(Mojolicious::Routes->new);

Диспетчер маршрутов, по умолчанию Mojolicious::Routes. Вы используете его в стартовом методе для определения конечных точек url (анг. url endpoints) для вашего приложения.

    sub startup {
        my $self = shift;
     
        my $r = $self->routes;
        $r->route('/:controller/:action')->to('test#welcome');
    }

secret

    my $secret = $app->secret;
    $app       = $app->secret('passw0rd');

Секретный пароль, используемый для подписанных cookies и т.п., по умолчанию — название приложения, что не очень надежно, поэтому вы должны изменить его!!! До тех пор, пока вы будете использовать значение по умолчанию, в лог файл будут писаться отладочные сообщения с напоминанием о смене пароля.

sessions

    my $sessions = $app->sessions;
    $app         = $app->sessions(Mojolicious::Sessions->new);

Простые подписанные cookies основаны на сессиях, по умолчанию используется объект Mojolicious::Sessions.

static

    my $static = $app->static;
    $app       = $app->static(Mojolicious::Static->new);

Для обслуживания статических ресурсов из каталога public, по умолчанию Mojolicious::Static.

types

    my $types = $app->types;
    $app      = $app->types(Mojolicious::Types->new);

Отвечает за подключений расширений файлов с MIME-типы, по умолчанию Mojolicious::Types.

  $app->types->type(twt => 'text/tweet');

МЕТОДЫ

Mojolicious наследует все методы от Mojo и реализует следующие новые.

new

    my $app = Mojolicious->new;

Создаёт новое приложение Mojolicious. Автоматически определяет ваш домашний каталог и устанавливает логирование, основываясь на вашем текущем режиме работы. Кроме того, устанавливается маршрутизация, статическая диспетчеризация и стандартный набор плагинов.

defaults

    my $defaults = $app->defaults;
    my $foo      = $app->defaults('foo');
    $app         = $app->defaults({foo => 'bar'});
    $app         = $app->defaults(foo => 'bar');

Значения по умолчанию для stash, предназначенный для каждого нового запроса.

    $app->defaults->{foo} = 'bar';
    my $foo = $app->defaults->{foo};
    delete $app->defaults->{foo};

dispatch

    $app->dispatch($c);

Сердце каждого приложения Mojolicious, вызывает диспетчеры статических файлов и маршрутов для каждого запроса, и перенаправляет их объекту Mojolicious::Controller.

handler

    $tx = $app->handler($tx);

Устанавливает контроллер по умолчанию и вызывает процесс для каждого запроса.

helper

    $app->helper(foo => sub { ... });

Добавление нового хелпера, который будет доступен как метод объекта контроллера и объекта приложения, а также функциям в шаблонах ep.

    # Хелпер
    $app->helper(add => sub { $_[1] + $_[2] });
     
    # Контроллер/Приложение
    my $result = $self->add(2, 3);
     
    # Шаблон
    <%= add 2, 3 %>

hook

    $app->hook(after_dispatch => sub { ... });

Расширение Mojolicious добавлением хуков для именованных событий.

Доступны следующие события, выполняются в указанном порядке.

  • after_build_tx

    Срабатывает после создания транзакции и до получения обработанного HTTP. Обратные вызовы этого хука запускаются в том порядке, в котором они созданы. Один из вариантов использования может быть индикатор прогресса загрузки. (Принимает транзакцию и экземпляр приложения)

        $app->hook(after_build_tx => sub {
            my ($tx, $app) = @_;
        });
    
  • before_dispatch

    Запускается до срабатывания диспетчера статики и маршрутизации, обратные вызовы этих хуков выполняются в порядке их создания. Очень полезен для модификации входящих запросов и других задач предварительной обработки. (Принимает экземпляр контроллера по умолчанию)

        $app->hook(before_dispatch => sub {
            my $self = shift;
        });
    
  • after_static_dispatch

    Срабатывает после диспетчера статики, который определяет, должен ли быть подан статический файл, и до запуска диспетчера маршрутов, обратные вызовы этого хука работают в обратном порядке. В основном используется для пользовательских диспетчеров и постобработки ответов статических файлов. (Принимает экземпляр контроллера по умолчанию)

        $app->hook(after_static_dispatch => sub {
            my $self = shift;
        });
    
  • before_render

    Срабатывает перед тем как рендерер вносит stash данные в ответ, обратные вызовы этого хука выполняются в порядке, в котором они были добавлены. Очень полезен для внесения корректив в stash до рендеринга. (Принимает экземпляр текущего контроллера и ссылку на хэш с аргументами)

      $app->hook(before_render => sub {
        my ($self, $args) = @_;
      });
    

    Обратите внимание, что этот хук является ЭКСПЕРИМЕНТАЛЬНЫМ и может измениться без предупреждения!

  • after_dispatch

    Запущенные после ответа, который был оказан, функции обратного вызова этого хука выполняются в обратном порядке. Отметим, что этот хук может запускаться до after_static_dispatch из-за его динамичного характера. Полезен для всех видов постобработки задач. (Принимает экземпляр текущего контроллера)

        $app->hook(after_dispatch => sub {
            my $self = shift;
        });
    

plugin

    $app->plugin('something');
    $app->plugin('something', foo => 23);
    $app->plugin('something', {foo => 23});
    $app->plugin('Foo::Bar');
    $app->plugin('Foo::Bar', foo => 23);
    $app->plugin('Foo::Bar', {foo => 23});

Загрузка плагина.

Следующие плагины включены в дистрибутив Mojolicious как примеры.

start

    Mojolicious->start;
    Mojolicious->start('daemon');

Запускает интерфейс командной строки Mojolicious::Commands для вашего приложения.

startup

    $app->startup;

Это ваша основная точка входа в приложении, метод будет вызываться при запуске.

    sub startup {
        my $self = shift;
    }

HELPERS

In addition to the attributes and methods above you can also call helpers on instances of Mojolicious. This includes all helpers from Mojolicious::Plugin::DefaultHelpers and Mojolicious::Plugin::TagHelpers.

  $app->log->debug($app->dumper({foo => 'bar'}));

ПОДДЕРЖКА

Web

    http://mojolicio.us

IRC

    #mojo on irc.perl.org

Список рассылки

    http://groups.google.com/group/mojolicious

РАЗРАБОТКА

Репозиторий

    http://github.com/kraih/mojo

КОМПЛЕКТ ФАЙЛОВ

Mojolicious поставляется с несколькими популярными статическими файлами в комплекте в каталоге public.

Лицензия Mojolicious

  Copyright (C) 2010-2011, Sebastian Riedel.

Licensed under the CC-SA License, Version 3.0 http://creativecommons.org/licenses/by-sa/3.0.

jQuery

  Version 1.6.2

JQuery является быстрой и компактной библиотекой JavaScript, которая упрощает обход HTML документа, обработку событий, анимацию и Ajax взаимодействие для быстрой веб-разработки. jQuery разработан, чтобы упростить разработку на JavaScript.

  Copyright 2011, John Resig.

Licensed under the MIT License, http://creativecommons.org/licenses/MIT.

prettify.js

  Version 1-Jun-2011

Модуль Javascript и CSS файл, которые позволяют реализовать подсветку синтаксиса фрагментов исходного кода в html странице.

  Copyright (C) 2006, Google Inc.

Licensed under the Apache License, Version 2.0 http://www.apache.org/licenses/LICENSE-2.0.

КОДОВЫЕ НАЗВАНИЯ

Каждый основной выпуск Mojolicious имеет кодовое название, здесь указаны те, которые использовались ранее.

1.4, Smiling Face With Sunglasses (u1F60E)

1.3, Tropical Drink (u1F379)

1.1, Smiling Cat Face With Heart-Shaped Eyes (u1F63B)

1.0, Snowflake (u2744)

0.999930, Hot Beverage (u2615)

0.999927, Comet (u2604)

0.999920, Snowman (u2603)

АВТОР

Sebastian Riedel, sri@cpan.org.

ПОЧЕТНЫЕ ГЛАВНЫЕ РАЗРАБОТЧИКИ

Выбывшие из основной команды, мы горячо благодарим Вас за Ваш труд.

Viacheslav Tykhanovskyi, vti@cpan.org.

БЛАГОДАРНОСТИ

В алфавитном порядке.

Abhijit Menon-Sen

Adam Kennedy

Adriano Ferreira

Al Newkirk

Alex Salimon

Alexey Likhatskiy

Anatoly Sharifulin

Andre Vieth

Andrew Fresh

Andreas Koenig

Andy Grundman

Aristotle Pagaltzis

Ashley Dev

Ask Bjoern Hansen

Audrey Tang

Ben van Staveren

Breno G. de Oliveira

Brian Duggan

Burak Gursoy

Ch Lamprecht

Charlie Brady

Chas. J. Owens IV

Christian Hansen

chromatic

Curt Tilmes

Daniel Kimsey

Danijel Tasov

David Davis

Dmitriy Shalashov

Dmitry Konstantinov

Eugene Toropov

Gisle Aas

Glen Hinkle

Graham Barr

Henry Tang

Hideki Yamamura

James Duncan

Jan Jona Javorsek

Jaroslav Muhin

Jesse Vincent

John Kingsley

Jonathan Yu

Kazuhiro Shibuya

Kevin Old

KITAMURA Akatsuki

Lars Balker Rasmussen

Leon Brocard

Magnus Holm

Maik Fischer

Marcus Ramberg

Mark Stosberg

Matthew Lineen

Maksym Komar

Maxim Vuets

Michael Harris

Mirko Westermeier

Mons Anderson

Moritz Lenz

Nils Diewald

Oleg Zhelo

Pascal Gaudette

Paul Tomlin

Pedro Melo

Peter Edwards

Pierre-Yves Ritschard

Quentin Carbonneaux

Rafal Pocztarski

Randal Schwartz

Robert Hicks

Robin Lee

Roland Lammel

Ryan Jendoubi

Sascha Kiefer

Sergey Zasenko

Simon Bertrang

Simone Tampieri

Shu Cho

Skye Shaw

Stanis Trendelenburg

Tatsuhiko Miyagawa

Terrence Brannon

The Perl Foundation

Tomas Znamenacek

Ulrich Habel

Ulrich Kautz

Uwe Voelker

Victor Engmark

Yaroslav Korshak

Yuki Kimoto

Zak B. Elep

КОПИРАЙТ И ЛИЦЕНЗИЯ

Copyright (C) 2008-2011, Sebastian Riedel.

Эта программа является свободным программным обеспечением, вы можете поставлять и/или модифицировать её на условиях Artistic License 2.0