Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
Столкнулся с проблемой при тестировании приложения на реальном хостинге. В разрабатываемом приложении некоторые методы классов(контроллеров) определены как Restfull, т.е. имеют префиксы put_ и _delete. На локальном хосте (использую Denwer, знаю что не лучший выбор, зато прост как табуретка. Если кто может посоветовать другую wamp сборку - с радостью попробую ее) проблем не возникало, при тестировании на 'боевом сервере' получил сообщение вида:
405 Method Not Allowed
Method Not Allowed
The requested method DELETE is not allowed for the URL /index.php.
Пробовал добавить в конструктор класса разрешение методов:
public function __construct()
{
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, PUT, POST, DELETE');
header('Access-Control-Allow-Headers: Content-Type');
header('Access-Control-Allow-Origin: *');
header('Access-Control-Request-Method: GET, PUT, POST, DELETE');
header('Access-Control-Allow-Headers: Content-Type');
parent::__construct();
}
Я так понимаю что методы PUT и DELETE запрещены на сервере, следовательно необходимо настраивать именно Apache(версия 2.2.19). Предположительно необходимо внести настройки хоста в файл apache2.conf. Возможно кто то подобное уже делал, если это так пожалуйста подскажите решение.
При поиске по просторам интернета встречал мнения что разрешать запросы типа PUT, DELETE - не безопасно для веб-сервера. Насколько это верное утверждение? В моем приложение данными запросами просто передаются параметры, которые обрабатывает приложение, в принципе изменить их на POST/GET труда не составит - но тогда на мой взгляд теряется красота использования Restfull контроллеров(Хотя возможно в моем случае использование данного подхода является излишним).
Очень хотелось бы знать мнение сообщества по данному вопросу.
Не в сети
Подозреваю, что ты неправильно создаёшь форму. Как это делается в шаблоне? Должно быть через PHPForm::open('url', 'delete/put')
. Если делать напрямую:
xml<form action="url" method="put">
— запрос будет уходить на сервер в чистом виде. тогда как внутренне Laravel подменяет не-GET и не-POST запрос на POST и и использует параметр, где передаёт тип оригинального запроса. На уровне фреймворка эта работа не видна, поэтому разработчик о ней может не знать — если использует стандартные классы, конечно.
- Если кто может посоветовать другую wamp сборку — с радостью попробую ее
Сам лет 8 назад использовал Денвер, но потом перешёл на XAMPP. Люди говорят, что тоже простой, если знать немного основы настройки виртуальных хостов в Apache — свой опыт тут привести не могу, так как когда переходил уже имел опыт системщика.
Могу сказать, что во всяком случае ставится он не сложнее Денвера — распаковка архива в корень диска и запуск setup_xampp.bat. .
Не в сети
Если кто может посоветовать другую wamp сборку — с радостью попробую ее
Еще зашибатая штука openserver, из коробки:
Управляющая программа Open Server 4.7.4;
Apache 2.2.23;
Apache 2.4.3;
Nginx 1.2.5;
MySQL 5.1.66;
MySQL 5.5.28;
MariaDB 5.5.28;
PostgreSQL 9.2.1;
PHP 5.2.17 (Zend Optimizer 3.3.3, IonCube Loader 4.0.7, Memcache 2.2.4);
PHP 5.3.18 (Xdebug 2.2.1, IonCube Loader 4.2.2, Memcache 2.2.7, Imagick 3.1.0);
PHP 5.4.8 (Xdebug 2.2.1, IonCube Loader 4.2.2, Memcache 2.2.7, Imagick 3.1.0);
FTP FileZilla 0.9.41;
ImageMagick 6.7.9;
Fake Sendmail 32;
NNCron Lite 1.17;
Memcached 1.2.6;
Adminer 3.6.1;
HeidiSQL 7.0;
Webgrind 1.0;
PHPMyAdmin 3.5.4;
PHPPgAdmin 5.1-dev;
PHPMemcachedAdmin 1.2.2;
ИМХО для винды лучше нет. Скачать можно здесь
Не в сети
Спасибо всем за советы касательно WAMP сборок, обязательно попробую все перечисленное.
Все запросы в приложении описаны посредством библиотеки jQuery, и имеют следующий вид:
$.ajax({
type: "DELETE",
url: "system/delete",
data: ({
id_system: idsystem
})
На бэкэнде запросы обрабатываются методами вида:
public function delete_method()
{
if( Request::ajax() ){
//логика метода
}
}
Для форм используются ajax-запросы с типом GET/POST. Посредством запросов PUT/DELETE происходит передача данных на сервер об обновлении/удалении записей, т.е. нет запроса на получение формы с сервера.
Не в сети
type: "DELETE", url: "system/delete",
Обычно для REST делается один одинаковый URL, а команда задаётся типом запроса, а здесь получается странный подход — тип DELETE и команда .../delete. Что будет, если запросить ту же команду через PUT? Или GET?
Судя по коду сервер просто блокирует эти типы запросов. Нужно вручную подставить PHPRequest::spoofer
(по умолчанию _method), чтобы Laravel распознал нестандартный запрос, как я описывал выше:
$.ajax({ type: "POST", url: "system/delete", data: ({ _method: 'DELETE', id_system: idsystem }) });
Не в сети
Обычно для REST делается один одинаковый URL, а команда задаётся типом запроса, а здесь получается странный подход - тип DELETE и команда %%.../delete%%. Что будет, если запросить ту же команду через PUT? Или GET?
Если сослаться на один и тот же метод различным типом запроса, то не удастся попасть в обработчик, поскольку каждый роут определен как:
Route::get/post/put/delete('url', array('auth'=>'before', 'controller@method') );
В моем приложении в рамках одного контроллера может присутствовать несколько методов с одинаковым типом запроса(POST/GET/DELETE/PUT), поэтому нужно обеспечить доступ к различным методам посредством разных url в файле routes.php. Возможно, я не правильно спроектировал приложение.
Использовал приведенный вами кусок кода, и все заработало! Спасибо за помощь.
Подскажите правильно ли я понял, выходит я могу не опасаться запросов описанных мною в routes.php как Route::delete(); поскольку они по сути являются запросами POST ?
Не в сети
- не удастся попасть в обработчик
Что это значит? Если 4 маршрута определены на одинаковом URL /controller/action, но используя разные типы запросов, то в ним можно попасть через эти самые типы запросов:
Route::get('url', ...);
Route::post('url', ...);
Route::delete('url', ...);
<a href="url">Создать</a> //=> GET url
<form action="url" method="post"> //=> POST url
<form action="url" method="delete">
<submit value="Удалить">
</form>
// тоже самое, но используя обход DELETE -> POST от Laravel:
{{ Form::open('url', 'delete') }}
{{ Form::submit('Удалить') }}
{{ Form::close() }}
<a href="url?_method=delete"> //=> DELETE url, тоже самое, но "нестандартно"
- В моем приложении в рамках одного контроллера может присутствовать несколько методов с одинаковым типом запроса
Так это обычная схема для RESTful: GET — получить элемент, POST — создать, PUT — изменить, DELETE — удалить. См. REST.
- поскольку они по сути являются запросами POST?
Изначально (если бы не Laravel) это были бы именно разные типы запросов, но Laravel понимая ограничения многих хостеров и сред вообще даёт возможность их обойти преобразованием обычных POST-запросов в любой метод HTTP с помощью «скрытого» параметра _method (скрытого потому что в Input::get() ты его не найдёшь).
Иными словами, если мы используем Laravel, то можно использовать любые типы запросов.
Не в сети
Страницы 1