Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
Добрый день! При разработке лендинг-страницы(в учебных целях) на фреймворке 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, ничего не изменилось.
Я в этом фрейворке новичок, по этому я не знаю все его тонкости и возможно мог допустить какую то простейшую ошибку, в общем я не могу понять в чем проблема, может у вас есть какие-то идеи на этот счет? Буду очень благодарен
Не в сети
1. Не понятно зачем вы роуты обернули в
Route::group([], function () { .. }
2. Попробуйте разнести по разным методам post и get обработку, а не проверять тип запроса внутри обработчика. P.S. были проблемы из-за этого с сессией
Не в сети
Да действительно забыл убрать
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">
Может тут что нетак?
Не в сети
Ну так все верно происходит. запрос обрабатывается и возвращается это же представление
Не в сети
Нет, оно же по идее должно открывать шаблон '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)
Не в сети
Убери вот это
Route::group(['prefix' => 'land.loc'], function() {
Route::group([], function () {
Не в сети
Спасибо, это помогло! я эту группу в роуте сделал из-за работы моего сервака, там запрос идет не через www.site.com, а через localhost/www.site.com, и как настроить это на WAMP я не знаю, короче буду переходить на openserver, еще раз спасибо!
Не в сети
Страницы 1