2015-12-22 3 views
8

Я только поэтому, простите меня. У меня есть четкое понимание CodeIgniter, поэтому я понимаю, что происходит. Тем не менее, я замечаю, что мой токен CSRF пуст, когда я создаю форму. Я работаю над видеороликами laracasts, чтобы задохнуться в рабочем процессе Laravel.Почему мой токен CSRF пуст при использовании формы :: open()?

myfile.blade.php

{!! Form::open((array('action' => '[email protected]'))) !!} 
    ... 
{{!! Form::close() !!}} 

Вот что я получаю, когда я смотрю на источник:

<form method="POST" action="http://mysite.dev/route" accept-charset="UTF-8"> 
<input name="_token" type="hidden"> 
</form> 

Я просматривал каталог конфигурации, но ничего не вижу на необходимо включить csrf. Есть ли дополнительная настройка где-то, что мне нужно обновить?

Благодарим вас за предложения.

EDIT

Даже это дает мне пустое скрытое поле ввода:

{{ Form::token() }} // <input name="_token" type="hidden"> 

EDIT

Вот что мой контроллер выглядит следующим образом:

//use Illuminate\Http\Request; 
use Request; 
use App\Article; 
use App\Http\Requests; 
use App\Http\Controllers\Controller; 


public function store(Request $request) 
{ 
    $input = Request::all(); 

    return $input; 
} 

Таким образом, мой обновленный вид тег выглядит следующим образом:

{!! Form::open((array('action' => '[email protected]'))) !!} 
... 

Когда я представляю, я могу видеть ответ JSon - маркер, очевидно, пусто.

{"_token":"","title":"test","body":"test"} 
+0

см. мой ответ @damon –

+0

Какую версию Laravel вы используете? Кроме того, если вы смотрите фундаментальную серию Laravel, она немного устарела. –

+0

Привет, Томас, похоже, я использую 5.2.3. Я работаю над сериями «Laravel 5 Fundamentals». – Damon

ответ

27

Фундаментальная серии Laravel для Laravel 5,0 поэтому у вас есть несколько вариантов. Вы можете установить Laravel 5.0 для продолжения этой серии. Для того чтобы установить L5.0, вам нужно запустить эту команду:

composer create-project laravel/laravel {directory} "~5.0.0" --prefer-dist 

Если вы хотите использовать Laravel 5.2, хотя (я бы рекомендовал и Jeffrey Way, скорее всего, выпустит серию на это в ближайшее время), есть есть несколько дополнительных вещей, которые необходимо учитывать.

Во-первых, поставить все ваши маршруты внутри «веб» промежуточного слоя группы, как это:

Route::group(['middleware' => ['web']], function() { 

    // Put your routes inside here 

}); 

В прошлом было несколько, которые работали промежуточное программное при каждом запросе по умолчанию. В 5.2 это уже не так. Например, токен хранится в сеансе, но в 5.2 такие вещи, как «промежуточное ПО« StartSession », не применяются автоматически. В результате, к вашим маршрутам необходимо применить «промежуточное ПО». Причина этого изменения в 5.2:

Группы промежуточного программного обеспечения позволяют группировать несколько промежуточных программ маршрута под одним удобным ключом, позволяя одновременно назначать несколько промежуточных программ для маршрута.Например, это может быть полезно при создании веб-интерфейса и API в одном приложении. Вы можете группировать сеанс и маршруты CSRF в группу web и, возможно, ограничитель скорости в группе api.

Кроме того, в основной серии Laravel, Джеффри тянет в пакет «illuminate/html», но теперь большинство людей используют коллективный пакет laravel. Они обрабатывают множество пакетов Laravel, которые выводятся из ядра. В результате я удалю пакет «lightight/html». В файле composer.json удалите "illuminate/html: 5.0" (или что-то еще в разделе require). Кроме того, удалите соответствующего поставщика услуг и фасадов форм, которые вы добавили в свой файл config/app.php.

Чтобы установить коллективную версию laravel, вместо этого добавьте это в свой файл composer.json: "laravelcollective/html": "5.2.*-dev". Затем запустите composer update. Как только это будет сделано, в файле config/app.php, добавьте это в массив провайдеров:

Collective\Html\HtmlServiceProvider::class, 

и добавить в массив псевдонимов:

'Form' => Collective\Html\FormFacade::class, 
'Html' => Collective\Html\HtmlFacade::class, 

Я надеюсь, что я не пропуская ничего другого.

+0

Большое вам спасибо за подробный ответ. – Damon

+0

Это, кажется, ответ, хотя мне интересно, если ... 'Route :: group (['middleware' => ['web']], function() ...' ... было достаточно – greaterKing

+0

Да, добавив, что к вашим маршрутам было * возможно, достаточно, но лучше переходить на использование laravelcollective/html, а не подсветить/html, потому что оно устарело и будет вызывать проблемы дальше по строке. Также стоит отметить - это обновляя его с помощью композитора ПЕРЕД добавлением строк в ваш app.php, иначе вы столкнетесь с ошибками. – Hanny

0

Это должно быть

{!! Form::open((array('action' => '[email protected]'))) !!} 
    ... 
{!! Form::close() !!} 
+0

Привет, Адам, спасибо за ответ!Я обновил ваше предложение, чтобы использовать мой фактический метод контроллера, и я все равно получаю то же самое. Скрытый ввод без значения. Это то, что я делаю (или не делаю), что вызывает его. Я обновил свой вопрос, чтобы включить полный контроллер. Возможно, есть что-то, что я не могу включить. – Damon

2

Это вопрос конфигурации .Вы необходимо установить ключ приложения в файле конфигурации ...config/app.php в строке 32 символов или использовать мастеровых CLI php artisan key:generate для genearte ключ для вас, чтобы иметь возможность использовать маркер CSRF.

Также убедитесь, что вы включаете маршруты, использующие токен CSRF в групповом маршруте web.

Вы можете исключить URIs путем определения их маршрутов за пределами веб промежуточного слоя группы, которая включена в файл routes.php по умолчанию, или путем добавления URIs к $ за исключением имущества VerifyCsrfToken промежуточного слоя: http://laravel.com/docs/5.2/routing#csrf-protection

0

Я решил проблему поставщика Класс HtmlService фактически 5,2 версии удалены загореться и добавить коллективный следовать шаг, чтобы решить эту проблему:

  1. composer require laravelcollective/html
  2. composer update
  3. добавить в конфиг/app.php

'providers' => ['Collective\Html\HtmlServiceProvider'], 'aliases' => [ 'Form' => 'Collective\Html\FormFacade', 'Html' => 'Collective\Html\HtmlFacade', ],

Затем вы можете использовать эту форму.

+0

Это трудно прочитать, потому что все выглядит так: Если вы можете отформатировать его лучше, это поможет. –

1

Если у вас есть страница входа в систему, и вы хотите, чтобы очистить сессию с помощью:

Session::flush(); 

Не забывайте, что это также очищает маркер CSRF, прежде чем он может быть поставлен в представлении