Laravel по-русски

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

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

#1 04.09.2017 20:00:51

Проблема при валидации данных с формы

Добрый день! При разработке лендинг-страницы(в учебных целях) на фреймворке Laravel 5.5 возникла проблема при реализации валидации данных с формы для дальнейшей отправки их на мыло администратору. Суть проблеммы заключается в том, что после валидации данных в заранее заготовленный шаблон не выводятся сообщения не о успешной передаче сообщения, не о ошибках. Решил посмотреть данные сессии, и обнаружилось что туда ничего не добавляется, хотя по идее должно бы, и массив ошибок $errors тоже пуст.
Мой роутер:

<?php
Route::group(['prefix' => 'land.loc'], function() {

     Route::group([], function () {

        Route::match(['get', 'post'], '/', ['uses' => 'IndexController@execute', 'as' => 'home']);
        Route::get('/page/{alias}', ['uses' => 'PageController@execute', 'as' => 'page']);

        Route::auth();

    });
});

Контроллер:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Page;
use App\People;
use App\Portfolio;
use App\Service;
use DB;
use Mail;


class IndexController extends Controller
{
    //
    public function execute(Request $request)
    {

        if($request->isMethod('post')){

            $messages = [

                'required' => "Поле :attribute обязательно к заполнению",
                'email' => "Поле :attribute должно соответствовать email адресу"

            ];

            $this->validate($request,[

                'name' => 'required|max:255',
                'email' => 'required|email',
                'text' => 'required'

            ], $messages);

            $data = $request->all();

            $result = Mail::send('site.email',['data'=>$data], function($message) use ($data) {

                $mail_admin = env('MAIL_ADMIN');

                $message->from($data['email'],$data['name']);
                $message->to($mail_admin,'Mr. Admin')->subject('Question');


            });

            if($result) {
                return redirect()->route('home')->with('status', 'Email is send');
            }

        }

        $pages = Page::all();
        $portfolios = Portfolio::all();
        $services = Service::all();
        $peoples = People::take(3)->get();

        //$filters = DB::table('portfolios')->distinct()->select('filter')->get();
        $filters = DB::table('portfolios')->distinct()->pluck('filter');
        $tags = [];

        foreach ($filters as $filter) {
            $tags[] = $filter;
        }

        //dd($tags);

        $menu = [];
        foreach ($pages as $page) {
            $item = ['title' => $page->name, 'alias' => $page->alias];
            array_push($menu, $item);
        }

        $item = ['title' => 'Services', 'alias' => 'service'];
        array_push($menu, $item);

        $item = ['title' => 'Portfolio', 'alias' => 'Portfolio'];
        array_push($menu, $item);

        $item = ['title' => 'Team', 'alias' => 'team'];
        array_push($menu, $item);

        $item = ['title' => 'Contact', 'alias' => 'contact'];
        array_push($menu, $item);

        //dd($menu);

        return view('site.index',
                                        [
                                            'menu' => $menu,
                                            'pages' => $pages,
                                            'services' => $services,
                                            'portfolios' => $portfolios,
                                            'peoples' => $peoples,
                                            'tags' => $tags
                                        ]);
    }
}

Форма для ввода данных:

<form action="{{ route('home') }}" method="post">

                            <input class="input-text" type="text" name="name" value="Your Name *" onFocus="if(this.value==this.defaultValue)this.value='';" onBlur="if(this.value=='')this.value=this.defaultValue;">
                            <input class="input-text" type="text" name="email" value="Your E-mail *" onFocus="if(this.value==this.defaultValue)this.value='';" onBlur="if(this.value=='')this.value=this.defaultValue;">
                            <textarea name="text" class="input-text text-area" cols="0" rows="0" onFocus="if(this.value==this.defaultValue)this.value='';" onBlur="if(this.value=='')this.value=this.defaultValue;">Your Message *</textarea>
                            <input class="input-btn" type="submit" value="send message">

                            {{ csrf_field() }}

</form>

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

@if(session('status'))

    <div class="alert alert-success">
        {{ session('status') }}
    </div>

@endif

@if(count($errors) > 0)

    <div class="alert alert-danger">
        <ul>

            @foreach($errors->all() as $error)

                <li>{{ $error }}</li>

            @endforeach

        </ul>
    </div>

@endif

Распечатка роут-листа:

+--------+---------------+---------------------------------+------------------+------------------------------------------------------------------------+--------------+
| Domain | Method        | URI                             | Name             | Action                                                                 | Middleware   |
+--------+---------------+---------------------------------+------------------+------------------------------------------------------------------------+--------------+
|        | GET|HEAD      | api/user                        |                  | Closure                                                                | api,auth:api |
|        | GET|POST|HEAD | land.loc                        | home             | App\Http\Controllers\IndexController@execute                           | web          |
|        | GET|HEAD      | land.loc/admin                  |                  | Closure                                                                | web,auth     |
|        | GET|HEAD      | land.loc/login                  | login            | App\Http\Controllers\Auth\LoginController@showLoginForm                | web,guest    |
|        | POST          | land.loc/login                  |                  | App\Http\Controllers\Auth\LoginController@login                        | web,guest    |
|        | POST          | land.loc/logout                 | logout           | App\Http\Controllers\Auth\LoginController@logout                       | web          |
|        | GET|HEAD      | land.loc/page/{alias}           | page             | App\Http\Controllers\PageController@execute                            | web          |
|        | POST          | land.loc/password/email         | password.email   | App\Http\Controllers\Auth\ForgotPasswordController@sendResetLinkEmail  | web,guest    |
|        | GET|HEAD      | land.loc/password/reset         | password.request | App\Http\Controllers\Auth\ForgotPasswordController@showLinkRequestForm | web,guest    |
|        | POST          | land.loc/password/reset         |                  | App\Http\Controllers\Auth\ResetPasswordController@reset                | web,guest    |
|        | GET|HEAD      | land.loc/password/reset/{token} | password.reset   | App\Http\Controllers\Auth\ResetPasswordController@showResetForm        | web,guest    |
|        | GET|HEAD      | land.loc/register               | register         | App\Http\Controllers\Auth\RegisterController@showRegistrationForm      | web,guest    |
|        | POST          | land.loc/register               |                  | App\Http\Controllers\Auth\RegisterController@register                  | web,guest    |
+--------+---------------+---------------------------------+------------------+------------------------------------------------------------------------+--------------+

Я сначала думал что проблема в том, что дублируется посредник web, но тут вроде бы все впорядке. Пытался перемещать \Illuminate\Session\Middleware\StartSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,

из $middlewareGroups 'web' просто в $middleware, ничего не изменилось.

Я в этом фрейворке новичок, по этому я не знаю все его тонкости и возможно мог допустить какую то простейшую ошибку, в общем я не могу понять в чем проблема, может у вас есть какие-то идеи на этот счет? Буду очень благодарен

Не в сети

#2 05.09.2017 08:35:15

Re: Проблема при валидации данных с формы

1. Не понятно зачем вы роуты обернули в

 Route::group([], function () { .. } 

2. Попробуйте разнести по разным методам post и get обработку, а не проверять тип запроса внутри обработчика. P.S. были проблемы из-за этого с сессией

Не в сети

#3 05.09.2017 10:31:20

Re: Проблема при валидации данных с формы

Да действительно забыл убрать

 Route::group([], function () { .. }  

. Просто я туда поначалу посредник web ставил, а когда узнал что он автоматом для все роутов ставиться, то убрал из параметров, а группу забыл удалить. Разделил обработку на 2 запроса:

<?php
Route::group(['prefix' => 'land.loc'], function() {

     Route::group([], function () {

        Route::get( '/', ['uses' => 'IndexController@executeGet', 'as' => 'home']);
        Route::post( '/', ['uses' => 'IndexController@executePost', 'as' => 'homePost']);
        Route::get('/page/{alias}', ['uses' => 'PageController@execute', 'as' => 'page']);

        Route::auth();

    });
});

Ничего не поменялось, причем самое интересное, походу post запрос вообще не обрабатывается, т.е. например если я в методе для обработки пост запроса просто верну шаблон, то ничего не происходит, просто перекидывает на текущую страницу:

public function executePost(Request $request)
    {
            return view('welcome');
    }

Что это за магия такая? P.S. в самой форме данные ссылаются сюда:

<form action="{{ route('homePost') }}" method="post">

Может тут что нетак?

Не в сети

#4 05.09.2017 10:45:00

Re: Проблема при валидации данных с формы

Ну так все верно происходит. запрос обрабатывается и возвращается это же представление

Не в сети

#5 05.09.2017 10:49:38

Re: Проблема при валидации данных с формы

Нет, оно же по идее должно открывать шаблон 'welcome', а в итоге ссылается на текущую страницус формой, которую я заполнял, как будто срабатывает просто get запрос (в get запросе возвращается

return view('site.index',
            [
                'menu' => $menu,
                'pages' => $pages,
                'services' => $services,
                'portfolios' => $portfolios,
                'peoples' => $peoples,
                'tags' => $tags
            ]);

)

Изменено Ravgus (05.09.2017 10:51:28)

Не в сети

#6 05.09.2017 10:54:03

Re: Проблема при валидации данных с формы

Убери вот это

Route::group(['prefix' => 'land.loc'], function() {

     Route::group([], function () {

Не в сети

#7 05.09.2017 11:32:12

Re: Проблема при валидации данных с формы

Спасибо, это помогло! я эту группу в роуте сделал из-за работы моего сервака, там запрос идет не через www.site.com, а через localhost/www.site.com, и как настроить это на WAMP я не знаю, короче буду переходить на openserver, еще раз спасибо!

Не в сети

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