Kohana 3 маршрутизации не удается при определенных условиях - PullRequest
3 голосов
/ 03 марта 2011

У меня очень раздражающая проблема с маршрутами Kohana 3 и / или что-то еще, что приводит к сбою моих маршрутов.

Маршрут, о котором идет речь, определяется как:

Route::set('module', '(<lang>/)<controller>(/<action>(/<id>))', array('lang' => $lang_options, 'controller' => '(docrepo|calendar|maps|forum)'))
->defaults(array(
        'controller' => 'docrepo',
        'lang' => DEFAULT_LANG,
        'action' => 'index',
));
  • этот маршрут работает нормально почти во всех случаях
  • конкретный случай, который вызывает у меня проблемы: / calendar / save
  • доступ к маршруту / calendar / save непосредственно из вкладки в Safari или IE всегда работает (например, https://my.site.com/calendar/save)
  • доступ к / calendar / save route непосредственно из вкладки в Firefox иногда работает (например, https://my.site.com/calendar/save)
  • доступ к маршруту / calendar / save из AJAX в любом браузере всегда завершается ошибкой , и в конечном итоге страница попадает в мой маршрут общего доступа и отправляется на страницу 404, отображается маршрут общего доступа ниже
  • доступ к другому действию для того же контроллера, и маршрут всегда работает (даже через AJAX) (например, https://my.site.com/calendar/edit отлично работает напрямую или через AJAX во всех браузерах)

Общий маршрут:

Route::set('catch_all', '<path>', array('path' => '(|.+)'))
->defaults(array(
    'controller' => 'base',
    'action' => '404',
));

В моих логах apache нет ошибок, так как все работает согласно apache и php.

В моих журналах Kohana нет ошибок, так как все работает в соответствии с Kohana.

Я добавил отладочный код на свою страницу 404, и вот результат вызова ajax в calendar / save:

The requested URI was not found:

calender/save

The requested URL was not found:

https://my.website.com/calender/save

Here is the request data:

object Request(19) {
    protected _requested_with => NULL
    protected _method => string(4) "POST"
    protected _protocol => string(5) "https"
    protected _referrer => NULL
    protected _route => object Route(5) {
        protected _callback => NULL
        protected _uri => string(6) "<path>"
        protected _regex => array(1) (
            "path" => string(5) "(|.+)"
        )
        protected _defaults => array(2) (
            "controller" => string(4) "base"
            "action" => string(3) "404"
        )
        protected _route_regex => string(21) "#^(?P<path>(|.+))$#uD"
    }
    protected _response => object Response(5) {
        protected _status => integer 200
        protected _header => object Http_Header(0) {
        }
        protected _body => string(0) ""
        protected _cookies => array(0) 
        protected _protocol => string(5) "https"
    }
    protected _header => object Http_Header(0) {
    }
    protected _body => string(878) "day_number=8&c_record[calendar_event][0][id]=&c_record[calendar_event][0][project_id]=1&c_record[calendar_event][0][start_date_time][date]=2011-03-08&c_record[calendar_event][0][start_date_time][hour]=8&c_record[calendar_event][0][start_date_time][min]=00&c_record[calendar_event][0][start_date_time][sec]=00&c_record[calendar_event][0][start_date_time][modulation]=am&c_record[calendar_event][0][start_date_time][modulation]=pm&c_record[calendar_event][0][end_date_time][date]=2011-03-08&c_record[calendar_event][0][end_date_time][hour]=5&c_record[calendar_event][0][end_date_time][min]=00&c_record[calendar_event][0][end_date_time][sec]=00&c_record[calendar_event][0][end_date_time][modulation]=am&c_record[calendar_event][0][end_date_time][modulation]=pm&c_record[calendar_event][0][title]=adsf&c_record[calendar_event][0][description]=asdf&c_record[calendar_event][0][link]="
    protected _directory => string(0) ""
    protected _controller => string(4) "base"
    protected _action => string(3) "404"
    protected _uri => string(13) "calender/save"
    protected _external => bool FALSE
    protected _params => array(1) (
        "path" => string(13) "calender/save"
    )
    protected _get => array(1) (
        1299176419 => string(0) ""
    )
    protected _post => array(2) (
        "day_number" => string(1) "8"
        "c_record" => array(1) (
            "calendar_event" => array(1) (
                0 => array(7) (
                    "id" => string(0) ""
                    "project_id" => string(1) "1"
                    "start_date_time" => array(5) (
                        ...
                    )
                    "end_date_time" => array(5) (
                        ...
                    )
                    "title" => string(4) "adsf"
                    "description" => string(4) "asdf"
                    "link" => string(0) ""
                )
            )
        )
    )
    protected _cookies => array(0) 
    protected _client => object Request_Client_Internal(5) {
        protected _previous_environment => NULL
        protected _cache => NULL
        protected _allow_private_cache => bool FALSE
        protected _request_time => NULL
        protected _response_time => integer 1299177212
    }
    public status => integer 404
}

Here is a test to see if this uri should match a route:

bool FALSE

bool FALSE

bool FALSE

bool FALSE

bool FALSE

bool FALSE

bool FALSE

bool FALSE

bool FALSE

bool FALSE

bool FALSE

bool FALSE

bool FALSE

bool FALSE

array(5) (
    "path" => string(13) "calender/save"
    "controller" => string(4) "base"
    "action" => string(3) "404"
    "uri" => string(13) "calender/save"
    "route" => object Route(5) {
        protected _callback => NULL
        protected _uri => string(6) "<path>"
        protected _regex => array(1) (
            "path" => string(5) "(|.+)"
        )
        protected _defaults => array(2) (
            "controller" => string(4) "base"
            "action" => string(3) "404"
        )
        protected _route_regex => string(21) "#^(?P<path>(|.+))$#uD"
    }
)

Вот тот же код отладки, который выполняется на странице, которая работает, поскольку вы можете видеть, что правильный маршрут отображается как соответствующий:

The requested URI wasfound:

calendar/index

The requested URL wasfound:

https://my.website.com/calendar/index

Here is the request data:

object Request(18) {
    protected _requested_with => NULL
    protected _method => string(3) "GET"
    protected _protocol => string(5) "https"
    protected _referrer => string(40) "https://my.website.com/calendar/index"
    protected _route => object Route(5) {
        protected _callback => NULL
        protected _uri => string(39) "(<lang>/)<controller>(/<action>(/<id>))"
        protected _regex => array(2) (
            "lang" => string(7) "(en-ca)"
            "controller" => string(29) "(docrepo|calendar|maps|forum)"
        )
        protected _defaults => array(3) (
            "controller" => string(7) "docrepo"
            "lang" => NULL
            "action" => string(5) "index"
        )
        protected _route_regex => string(130) "#^(?:(?P<lang>(en-ca))/)?(?P<controller>(docrepo|calendar|maps|forum))(?:/(?P<action>[^/.,;?\n]++)(?:/(?P<id>[^/.,;?\n]++))?)?$#uD"
    }
    protected _response => object Response(5) {
        protected _status => integer 200
        protected _header => object Http_Header(0) {
        }
        protected _body => string(0) ""
        protected _cookies => array(0) 
        protected _protocol => string(5) "https"
    }
    protected _header => object Http_Header(0) {
    }
    protected _body => NULL
    protected _directory => string(0) ""
    protected _controller => string(8) "calendar"
    protected _action => string(5) "index"
    protected _uri => string(14) "calendar/index"
    protected _external => bool FALSE
    protected _params => array(1) (
        "lang" => NULL
    )
    protected _get => array(1) (
        "reset_date" => string(1) "1"
    )
    protected _post => array(0) 
    protected _cookies => array(0) 
    protected _client => object Request_Client_Internal(5) {
        protected _previous_environment => NULL
        protected _cache => NULL
        protected _allow_private_cache => bool FALSE
        protected _request_time => NULL
        protected _response_time => integer 1299178100
    }
}

Here is a test to see if this uri should match a route:

bool FALSE

bool FALSE

bool FALSE

bool FALSE

bool FALSE

bool FALSE

bool FALSE

bool FALSE

bool FALSE

bool FALSE

array(5) (
    "lang" => NULL
    "controller" => string(8) "calendar"
    "action" => string(5) "index"
    "uri" => string(14) "calendar/index"
    "route" => object Route(5) {
        protected _callback => NULL
        protected _uri => string(39) "(<lang>/)<controller>(/<action>(/<id>))"
        protected _regex => array(2) (
            "lang" => string(7) "(en-ca)"
            "controller" => string(29) "(docrepo|calendar|maps|forum)"
        )
        protected _defaults => array(3) (
            "controller" => string(7) "docrepo"
            "lang" => NULL
            "action" => string(5) "index"
        )
        protected _route_regex => string(130) "#^(?:(?P<lang>(en-ca))/)?(?P<controller>(docrepo|calendar|maps|forum))(?:/(?P<action>[^/.,;?\n]++)(?:/(?P<id>[^/.,;?\n]++))?)?$#uD"
    }
)

bool FALSE

bool FALSE

bool FALSE

array(5) (
    "path" => string(14) "calendar/index"
    "controller" => string(4) "base"
    "action" => string(3) "404"
    "uri" => string(14) "calendar/index"
    "route" => object Route(5) {
        protected _callback => NULL
        protected _uri => string(6) "<path>"
        protected _regex => array(1) (
            "path" => string(5) "(|.+)"
        )
        protected _defaults => array(2) (
            "controller" => string(4) "base"
            "action" => string(3) "404"
        )
        protected _route_regex => string(21) "#^(?P<path>(|.+))$#uD"
    }
)

Код JavaScript, где я вызываю функцию сохранения:

calendar.save_event = function() {
    var save_url = URL_ROOT + '/calender/save?' + TIME_STAMP;
    // prepare the data string
    var inputs = [];
    // get all the form elements and add them to the parameter string to be sent via ajax
    $('#dialog_form :input').each( function() {
        // only add if not a checkbox, or if it is a checkbox, then it must be checked
        if ( ! $(this).is(':checkbox') || $(this).is(':checked')) {
            inputs.push(this.name + '=' + encodeURIComponent(this.value));
        }
    });
    alert('try saving by posting to: ' + save_url);
    // try to save the record
    $.ajax({
        type: 'POST',
        data: inputs.join('&'),
        url: save_url,
        dataType: 'json',
        success: function(data, text_status) {
            if (data['status'] == 1) {
                alert(data['status_message']);
                // add the event to the calendar
                // todo add actual event details
                $("#day_number" + $('#initial_day_number').val()).append("new event");
                // close the dialog box
                $('#dialog_form').dialog("close");
            } else {
                alert('The event could not be saved at this time.  Please try again later. (' + data['status_message'] + ')');
            }
        },
        error: function(xml_request, text_status, error_thrown) {
            alert('The event could not be saved at this time.  Please try again later. (' + text_status + ')');
        }
    });
}

В приведенном выше коде URL_ROOT установлен правильно. Я добавил это потому, что изначально использовал относительную ссылку «/ calendar / save», но ни одна из них не работает. Я также добавил параметр TIME_STAMP GET, который является просто текущей меткой времени UNIX (time () в php), чтобы проверить, не является ли это проблемой кэширования. Это также не имеет никакого значения.

Согласно коду отладки, вы можете видеть, что вызов идет по правильному URL, просто по какой-то причине он не соответствует.

Любая помощь будет принята с благодарностью.

Спасибо, Крейг

1 Ответ

0 голосов
/ 13 апреля 2011

Вы скопировали / вставили это или напечатали? Поскольку это похоже на ошибочный код ajax, вы набрали calender вместо calendar. Это также отображается в отладочной информации 404.

...