Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 22.11.2012 12:13:50

Запросы PUT DELETE

Столкнулся с проблемой при тестировании приложения на реальном хостинге. В разрабатываемом приложении некоторые методы классов(контроллеров) определены как 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 контроллеров(Хотя возможно в моем случае использование данного подхода является излишним).

Очень хотелось бы знать мнение сообщества по данному вопросу.

Не в сети

#2 22.11.2012 14:07:32

Re: Запросы PUT DELETE

Подозреваю, что ты неправильно создаёшь форму. Как это делается в шаблоне? Должно быть через PHPForm::open('url''delete/put'). Если делать напрямую: xml<form action="url" method="put"> — запрос будет уходить на сервер в чистом виде. тогда как внутренне Laravel подменяет не-GET и не-POST запрос на POST и и использует параметр, где передаёт тип оригинального запроса. На уровне фреймворка эта работа не видна, поэтому разработчик о ней может не знать — если использует стандартные классы, конечно.

  1. Если кто может посоветовать другую wamp сборку — с радостью попробую ее

Сам лет 8 назад использовал Денвер, но потом перешёл на XAMPP. Люди говорят, что тоже простой, если знать немного основы настройки виртуальных хостов в Apache — свой опыт тут привести не могу, так как когда переходил уже имел опыт системщика.

Могу сказать, что во всяком случае ставится он не сложнее Денвера — распаковка архива в корень диска и запуск setup_xampp.bat. .

Не в сети

#3 22.11.2012 20:01:02

Cheshirrski
masterМастер
Откуда: Днепр
Сообщений: 116
Статей: 2

Re: Запросы PUT DELETE

Если кто может посоветовать другую 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;

ИМХО для винды лучше нет. Скачать можно здесь

Не в сети

#4 22.11.2012 22:25:48

Re: Запросы PUT DELETE

Про OpenServer уже писали раньше на форуме. Если интересно: 1, 2.

Не в сети

#5 25.11.2012 22:38:12

Re: Запросы PUT DELETE

Спасибо всем за советы касательно WAMP сборок, обязательно попробую все перечисленное.
Все запросы в приложении описаны посредством библиотеки jQuery, и имеют следующий вид:

$.ajax({
     type: "DELETE",
     url: "system/delete",
     data: ({
                id_system: idsystem
     })

На бэкэнде запросы обрабатываются методами вида:

 public function delete_method()
 {
   if( Request::ajax() ){
        //логика метода
   }
 }

Для форм используются ajax-запросы с типом GET/POST. Посредством запросов PUT/DELETE происходит передача данных на сервер об обновлении/удалении записей, т.е. нет запроса на получение формы с сервера.

Не в сети

#6 26.11.2012 09:11:54

Re: Запросы 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
     })
});

Не в сети

#7 27.11.2012 11:09:38

Re: Запросы PUT DELETE

Proger_XP пишет:

Обычно для 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 ?

Не в сети

#8 27.11.2012 14:38:40

Re: Запросы PUT DELETE

  1. не удастся попасть в обработчик

Что это значит? Если 4 маршрута определены на одинаковом URL /controller/action, но используя разные типы запросов, то в ним можно попасть через эти самые типы запросов:

PHP
Route::get('url', ...);
Route::post('url', ...);
Route::delete('url', ...);

Навигация:

PHP
<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, тоже самое, но "нестандартно"
  1. В моем приложении в рамках одного контроллера может присутствовать несколько методов с одинаковым типом запроса

Так это обычная схема для RESTful: GET — получить элемент, POST — создать, PUT — изменить, DELETE — удалить. См. REST.

  1. поскольку они по сути являются запросами POST?

Изначально (если бы не Laravel) это были бы именно разные типы запросов, но Laravel понимая ограничения многих хостеров и сред вообще даёт возможность их обойти преобразованием обычных POST-запросов в любой метод HTTP с помощью «скрытого» параметра _method (скрытого потому что в Input::get() ты его не найдёшь).

Иными словами, если мы используем Laravel, то можно использовать любые типы запросов.

Не в сети

Подвал раздела