Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> catalyst::Controller 
:(
    Опции темы
gcc
Дата 20.4.2009, 08:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

Репутация: 1
Всего: 17



вот начал смотреть контроллеры исходники...

сделал несколько моделей

нашел модуль Catalyst::Controller::FormBuilder, решил сделать свой аналогичный,  мне он не понравился тем что там надо тэги другие вставлять, и не опнял на счет фильтрации что делать

вот посмотрел исходники 2 файла с этого модуля, скажите что объединяет этих двух файлов?

http://cpansearch.perl.org/src/JCAMACHO/Ca.../FormBuilder.pm
http://x0.org.ua/perl/Action.pm
 

1) что означает:
Код

    no strict 'refs';
    *{"$class\::$method"} = $class->make_accessor($method);



2) и что означет 2 подчеркивания:
Код

sub __setup {


3) и не понятно написано это:
Код

sub _formbuilder {
    my $self   = shift;
    my $method = $self->_fb_setup->{method_name};
    $self->$method(@_);
}

что хотели этим сделать?

4) не понял это особенно под конец:
Код

sub create_action {
    my $self = shift;
    my %args = @_;

    my $attr_name = $self->_fb_setup->{attr_name};

    if ( exists $args{attributes}{$attr_name} ) {
        $args{_attr_params} = delete $args{attributes}{$attr_name};
        if ( my $source_type = $self->_fb_setup->{source_type} ) {
            $args{_source_type} = $source_type;
        }
        push @{ $args{attributes}{ActionClass} }, $self->_fb_setup->{action};
    }

    $self->SUPER::create_action(%args);
}




5) как написать конструктор в контроллере чтобы он вот так  my $form = $self->formbuilder; инициализировался сам?




Это сообщение отредактировал(а) gcc - 20.4.2009, 09:52
PM WWW ICQ Skype GTalk Jabber   Вверх
ginnie
Дата 20.4.2009, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



gcc, подскажу по некоторым вопросам

1. make_accessor возвращает ссылку на функцию, которая сохраняется под именем $method в таблице имен модуля с именем $class. Действие аналогично простому определению функции с именем $method в классе с именем $class, но делается не на этапе компиляции, а на этапе выполнения. no strict 'refs' необходим т.к. используется символическая ссылка (т.е. не по адресу, а по имени).

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

3. могу предположить следующее
Код

sub _formbuilder {
    my $self   = shift;
    my $method = $self->_fb_setup->{method_name}; # получаем имя метода, который будем вызывать
    $self->$method(@_); # вызываем метод, используя символическую ссылку (работает только при no strict 'refs')
}



--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
gcc
Дата 21.4.2009, 03:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

Репутация: 1
Всего: 17



ginnie, спасибо не много понял...



зачем там пишется это?
Код

use base qw/Catalyst::Controller/;



скорее всего для этого

Код

$self->create_action(%args)

Called with a hash of data to be use for construction of a new Catalyst::Action (or appropriate sub/alternative class) object.


но что оно дает?

========================================

в Catalyst::Action 

если я правильно понял сделан для того чтобы "прицепить" к объекту $c методы (только не пнтяно зачем)

http://x0.org.ua/perl/Action.pm

Код


sub execute {
    my $self = shift;
    my ( $controller, $c ) = @_;

    return $self->NEXT::execute(@_)
      unless exists $self->attributes->{ActionClass}
      && $self->attributes->{ActionClass}[0] eq
      $controller->_fb_setup->{action};

    my $form = $self->_setup_form(@_);
    Scalar::Util::weaken($form->{c});
    $controller->_formbuilder($form);
    $self->NEXT::execute(@_);
    $controller->_formbuilder($form);   # keep the same form in case of forwards

    $self->setup_template_vars( @_ );
}


от куда это взялось   my ( $controller, $c ) = @_; ?
что такое $controller

посмотрел еще Catalyst::Dispatcher но там не написаны примеры

вот я написал класс, что мне в него добавить что это был контроллер?
Код


package FormValid;

# use strict;
use warnings;
use base qw(Class::Accessor);
__PACKAGE__->mk_accessors(qw/name id html text/);
sub new {
    my $class = shift;
    my $self = bless {}, $class;
    return $self;
}
sub out_tree {
my $self = shift;
my $sql = $self->sql;
my $dbh = $self->dbh;
$startid =  $self->startid;


Это сообщение отредактировал(а) gcc - 21.4.2009, 03:26
PM WWW ICQ Skype GTalk Jabber   Вверх
gcc
Дата 21.4.2009, 07:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

Репутация: 1
Всего: 17



еще нашел метода, часто пишет в коде

Код

sub ACCEPT_CONTEXT {
    return shift->{'.tla'};
}


http://cpansearch.perl.org/src/DCARDWELL/C.../TextLinkAds.pm

Код

ACCEPT_CONTEXT($c, @args)

Catalyst components are normally initialized during server startup, either as a Class or a Instance. However, some components require information 
about the current request. To do so, they can implement an ACCEPT_CONTEXT method.

If this method is present, it is called during $c->comp/controller/model/view with the current $c and any additional args (e.g. $c->model('Foo', qw/bar 
baz/) would cause your MyApp::Model::Foo instance's ACCEPT_CONTEXT to be called with ($c, 'bar', 'baz')) and the return value of this method is 
returned to the calling code in the application rather than the component itself.


http://search.cpan.org/~flora/Catalyst-Run...st/Component.pm

что-то я не понял или не правильно перевел, но смысл так и не понял...

Это сообщение отредактировал(а) gcc - 21.4.2009, 07:07
PM WWW ICQ Skype GTalk Jabber   Вверх
gcc
Дата 21.4.2009, 07:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

Репутация: 1
Всего: 17



Цитата(ginnie @ 20.4.2009,  11:48)

1. make_accessor возвращает ссылку на функцию, которая сохраняется под именем $method в таблице имен модуля с именем $class. Действие аналогично простому определению функции с именем $method в классе с именем $class, но делается не на этапе компиляции, а на этапе выполнения. no strict 'refs' необходим т.к. используется символическая ссылка (т.е. не по адресу, а по имени).


ginnie, а что происходит после этого   *{"$class\::$method"} = $class->make_accessor($method); ?

вот еще нашел не понял:

Код

*{__PACKAGE__ . "::$sub"} = sub {

зачем это сделано?

Код

sub new {
    my ( $self, $c ) = @_;
    $self = $self->NEXT::new($c);
    $self->{namespace}               ||= ref $self;
    $self->{additional_base_classes} ||= ();
    for my $sub ( @{$self->{subroutines}} ) {
        my $target_class = $self->{target_class};
        unless ( $CLASS_CACHE{$target_class}{$sub} ) {
            $c->log->debug( "Installing sub:$sub from target_class:$target_class into proxy" ) if $c->debug;
            $CLASS_CACHE{$target_class}{$sub} = 1;
            no strict 'refs';
            *{__PACKAGE__ . "::$sub"} = sub {
                shift;
                return $c->model($target_class)->$sub(@_);
            }
        }
    }
    return $self;
}


http://cpansearch.perl.org/src/ALEXP/Catal.../Model/Proxy.pm

Код

    *{"${class}::${collection_moniker}::ACCEPT_CONTEXT"} = sub {


Код

................................................................
  foreach my $moniker ( keys %collections ) {
    next if $collections{$moniker};
    # perhaps you're too lazy to create Collection class.
    # now we should try creating default one!
    my $package_body = <<"EOT";
package $moniker;
use strict;
use base qw( Jifty::DBI::Collection );
1;
EOT
      eval $package_body;
      croak "Can't prepare $moniker: $@" if $@;
  }

  foreach my $moniker ( @monikers ) {
    $moniker->require or croak $@;
    next if $moniker =~ /Collection$/;

    $moniker =~ s/^$schema_base\:://;
    *{"${class}::${moniker}::ACCEPT_CONTEXT"} = sub {
      shift;
      shift->model( $model_name )->record( $moniker );
    };

    my $collection_moniker = $moniker.'Collection';
    *{"${class}::${collection_moniker}::ACCEPT_CONTEXT"} = sub {
      shift;
      shift->model( $model_name )->collection( $collection_moniker );
    };
  }
  return $self;
}


http://cpansearch.perl.org/src/ISHIGAKI/Ca...el/Jifty/DBI.pm



Это сообщение отредактировал(а) gcc - 21.4.2009, 07:40
PM WWW ICQ Skype GTalk Jabber   Вверх
ginnie
Дата 21.4.2009, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



gcc, вот пример, в котором выводится таблица имен пакета Test до и после выполнения *{'Test::new_func'} = sub { return; };

Код

use strict;
use warnings;

print join($/, keys %Test::), $/, '-' x 20, $/;

{
    no strict 'refs';
    *{'Test::new_func'} = sub { return; };
}

print join($/, keys %Test::), $/;

package Test;

sub test { return; }


Код

test
--------------------
test
new_func


т.е. в пакет Test динамически добавилась новая функция, которую далее можно вызывать при помощи Test::new_func(). Аналогично при использовании объектов в класс добавляются необходимые новые функции (например, аксессоры).



--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1279 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.