Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Каким то чудесным образом все это пофиксилось..
Данные о юзере получаю в контроллере и шаблоне через Auth::user()
В файербаг после авторизации вижу вот что
Скорее нахожу примеры как не пускать не авторизованного в какой то раздел.. Понятно, что может и это понадобится и пускать, но показывать что авторизован..
Да я не в той версии смотрел. Не думал, что разница столь существенна и касается именно такого момента.
Теперь другой вопрос.
Хочу разобраться с авторизацией.
В примерах вижу, что рекомендуют пользовать Auth::attempt
if (Auth::attempt(array('email' => $request["email"], 'password' => $request["password"]))) {
return Redirect::to('/')->with('success', 'Вы успешно вошли на сайт');
}
Не очень понял он только проверяет верный ли логин пароль, или все же и авторизует юзера, ставит сессию...
Пробую в routes следующее
Route::group(['middleware' => ['web']], function () {
//Route::auth();
if (Auth::check()) {
$user = Auth::user();
}
dd(Auth::check());
//dd(Auth::user());
Route::get('/signup/', 'RegistController@getRegister');
Route::post('/signup/create', 'RegistController@postRegister');
Route::get('/login/', 'RegistController@getLogin');
Route::post('/login/enter', 'RegistController@postLogin');
Route::any('/', 'ItemsController@index');
Route::get('/items', 'ItemsController@index');
Route::get('/items/{itemid}', 'ItemsController@item');
Route::get('/auth/logout', function() {
Auth::logout();
return Redirect::to('login');
});
});
По идее после того как вошел Auth:attempt на любой странице меня должно распозновать, но увы Auth::check() возвращает false и user тоже пустой.
А вообще как правильно делать что бы для каждой страницы проверялось авторизован ли и если да то была глобально доступна переменная $user ну что бы скажем в шаблоне написать if ($user) Вы авторизованы как else ссылка на авторизацию/регистрацию.
Заработало ответ тут http://stackoverflow.com/questions/3597 … how-errors
Нужен был web middleware для показа ошибок при возрате в форму.
Непонятно почему это совсем нигде не указывается в документации про валидацию.
Попробовал создать форму заново на основе почти чистого примера из документации https://laravel.com/docs/5.1/validation
Контроллер
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use View;
use Validator;
class PostController extends Controller
{
/**
* Show the form to create a new blog post.
*
* @return Response
*/
public function create()
{
return view('post.create');
}
/**
* Store a new blog post.
*
* @param Request $request
* @return Response
*/
public function store(Request $request)
{
// Validate and store the blog post...
}
}
форма
<h1>Create Post</h1>
@if (count($errors) > 0)
<div class="alert alert-danger">
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
<html>
<head>
<title>Post form</title>
</head>
<body>
<form action="/newitem/save" method="POST">
<input type="hidden" name="_token" value="{{ csrf_token() }}">
<div class="form-group">
<label for="title">Title</label>
<input type="text" id="title" name='title'>
</div>
<button type="submit" class="btn btn-default">Save</button>
</form>
</body>
</html>
Выдает ошибку ErrorException in c5df03aa6445eda15ddf9d4b3d08e7882dfe13e1.php line 3: Undefined variable: errors (View: /www/alexey-laravel-1/resources/views/post/create.blade.php)
Ругается на стандартную как я понимаю конструкцию вывода ошибок в форме. Еще до того как их валидатор вернул их понятно дело нет.
Но на то условие как я понимаю @if (count($errors) > 0)
Возможно, что то не то в настройках приложения в целом?
Ну что никто ничего не скажет... Уже хочется отказаться от использования фреймворка..
Ошибка на ровном месте в общем то.
Может быть проблема все же в запросе?
Форма вот такая привожу полностью
@extends('master')
@section('cont')
<h2>{{$subtitle}}</h2>
<form action="/signup/create" method="POST">
<input type="hidden" name="_token" value="{{ csrf_token() }}">
<div class="form-group">
<label for="email">Email</label>
<input type="text" id="email" placeholder="Email" name='email'>
</div>
<div class="form-group">
<label for="password">Пароль</label>
<input type="password" id="password" placeholder="Пароль" name="password">
</div>
<div class="form-group">
<label for="confirm_password">Повторите пароль</label>
<input type="password" id="confirm_password" placeholder="Повторите пароль" name="password_confirmation">
</div>
<button type="submit" class="btn btn-default">Отправить</button>
</form>
@endsection
ErrorException in RegistController.php line 38: Undefined property: Illuminate\Validation\Validator::$errors
это на второй вариант ругается с make
Да я уже даже другой контроллер создал и нет отдельного метода validate, а только вызов. Но все тоже самое
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Requests;
use View;
use Validator;
class RegistController extends Controller
{
//
public function getRegister()
{
$data = [
'title' => 'Каталог - регистрация ',
'pagetitle' => 'Каталог',
'subtitle' => 'Регистрация'
];
//dd($data);
return View::make('incs.signup', $data);
}
public function postRegister(Request $request)
{
//dd($request);
$this->validate($request, [
'email' => 'required|unique|max:255',
'password' => 'required',
]);
dd($v->errors);
}
}
другой вариант
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Requests;
use View;
use Validator;
class RegistController extends Controller
{
//
public function getRegister()
{
$data = [
'title' => 'Каталог - регистрация ',
'pagetitle' => 'Каталог',
'subtitle' => 'Регистрация'
];
//dd($data);
return View::make('incs.signup', $data);
}
public function postRegister(Request $request)
{
//dd($request);
$v = Validator::make($request->all(), [
'email' => 'required|email|max:255',
'password' => 'required|confirmed|min:6',
]);
$v->fails();
dd($v->errors);
}
}
Оба варианта не работают не в шаблоне нет erorrs, не в контроллере
Попробовал переделать участок кода где проверка так:
$v = Validator::make($request->all(), [
'email' => 'required|email|max:255',
'password' => 'required|confirmed|min:6',
]);
if ($v->fails())
{
dd($v->errors);
}
Выдает ошибку
ErrorException in AuthController.php line 82: Undefined property: Illuminate\Validation\Validator::$errors
Если попробовать dd($v) то
Validator {#148 ▼
#translator: Translator {#146 ▶}
#presenceVerifier: DatabasePresenceVerifier {#147 ▶}
#container: Application {#2 ▶}
#failedRules: array:2 [▶]
#messages: MessageBag {#149 ▶}
#data: array:4 [▶]
#files: []
#rules: array:2 [▶]
#implicitAttributes: []
#after: []
#customMessages: []
#fallbackMessages: []
#customAttributes: []
#customValues: []
#extensions: []
#replacers: []
#sizeRules: array:4 [▶]
#numericRules: array:2 [▶]
#implicitRules: array:10 [▶]
#dependentRules: array:9 [▶]
}
То есть ошибок нет.
Показываю также input
array:4 [▼
"_token" => ""
"email" => ""
"password" => ""
"password_confirmation" => ""
]
То есть вообще пустые поля засылаю. А ошибки нет.. Почему?
Не могу получить ошибки от валидатора
namespace App\Http\Controllers\Auth;
use App\User;
use Validator;
use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\ThrottlesLogins;
use Illuminate\Foundation\Auth\AuthenticatesAndRegistersUsers;
use Illuminate\Http\Request;
use Redirect;
use View;
use App\Code;
use Illuminate\Support\Facades\Mail;
use App\Http\Controllers\CodeController;
class AuthController extends Controller
{
....
public function postRegister(Request $request)
{
$validator = $this->validator($request->all());
if ($validator->fails())
{
dd($validator->errors->all());
$messages = $validator->getMessages()->all();
dd($messages);
return Redirect::to('signup')->withErrors($validator)->withInput();
//return Redirect::back()->withInput()->withErrors($validator);
}
/*
$this->validate($request, [
'email' => 'required|email|max:255|unique:users',
'password' => 'required|confirmed|min:6',
]);
*/
}
protected function validator(array $data)
{
return Validator::make($data, [
'email' => 'required|email|max:255|unique:users',
'password' => 'required|confirmed|min:6',
]);
}
}
В шаблоне
@foreach ($errors->all() as $error)
<div>{{ $error }}</div>
@endforeach
Или в шаблоне
@if (count($errors) > 0)
<div>Ой, беда!</div>
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
@endif
Или просто
{{ $errors }}
Пробовал оба вариант и редиректить withErrors и то что сейчас закоментировано:
$this->validate($request, [
'email' => 'required|email|max:255|unique:users',
'password' => 'required|confirmed|min:6',
]);
В шаблоне с ошибками глухо, переменной нет. Но ошибки есть тк перекидывает обратно в шаблон, очевидно валидация срабатывает и возвращает false
В контроллере как видно в коде, пытаюсь их вывести
dd($validator->errors->all());
$messages = $validator->getMessages()->all();
dd($messages);
и тоже ничего
>У вас форич возвращает объекты. А вы к ним как к массивам обращаетесь.
пофиксилось..
А по теорическим вопросам. Прежде всего сложные запросы и формы кто нибудь может подсказать простые практики, так же бы не углуюлятся сильно в active record orm итд.
ага то есть при raw sql структура коллекции с результатами немного другая?
Всем привет!
Изучаю laravel второй день, никогда раньше не пользовался фреймворками, но писал на чистом php около 10 лет.
Сделал тестовую страницу на которую пытаюсь вывести несколько записей из БД. Сначала делал все как везде пишут то есть через ORM и все работало.
Но затем захотел join'ить вторую табличку хотя бы в отношении один к одному, решил попробовать для начала raw sql
И вот что вышло
В модели
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
use DB;
class Item extends Model
{
//
public function getItemsWithCpu()
{
$items = DB::select('select i.*, c.title as cputitle from items i join cpus c on i.cpuid=c.id');
return $items;
//return $this->hasOne('Cpu');
}
}
в контроллере
<?php namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use App\Item;
use DB;
class HomeController extends Controller {
public function index(Item $itemModel)
{
//$items = array();
//$items[] = ["id" => 1, "name" => "продукт 1", "descr" => "Отличный продукт 1"];
//$items[] = ["id" => 2, "name" => "продукт 2", "descr" => "Отличный продукт 2"];
//$items = Item::all();
$items = $itemModel->getItemsWithCpu();
//dd($items);
$data = [
'title' => 'Каталог - список',
'pagetitle' => 'Каталог',
'subtitle' => 'Список продуктов',
'items' => $items
];
//dd($data);
return view("incs.itemlist", $data);
}
и в шаблоне
@extends('master')
@section('cont')
<h2>{{$subtitle}}</h2>
@foreach($items as $item)
<div><a href="/items/{{$item['id']}}">{{$item['title']}}</a></div>
@endforeach
@endsection
Пока данные получались просто через $items = Item::all(); все работало. А теперь ругается как я понимаю на foreach
FatalErrorException in
858e3d2b2b5779e85b41b79821e86c9637f363f2.php line 5:
Cannot use object of type stdClass as array
В dd() контроллере данные есть. Почему их нельзя обойти foreach, а чем можно?
И еще вопросы больше общетеоретические:
1) migration попробовал поразбирался. Таблицы создаются, столбцы добавляются, данные seed заполняются. Но... Думаю, а нужны ли они.
Системой контроля версий мы не пользуемся. Таблицы все равно видимо будем править руками в GUI через командную строку mysql итд.
Можно ли безболезненно от них отказаться? Не завязано ли что то во фремворке именно на их использование?
2) Ну и почти аналогичный вопрос про ORM, разумно ли от него отказаться, писать запросы на чистом sql в модели методы для определенных запросов на чистом sql создавать, а то и в контроллере.
Ну или как то смешивать оба подхода.. Более сложные запросы писать raw для второстепенных таблиц не делать модели, а просто включать и в join'ы подзапросы руками.
Что в этом случае важно не упустить?
3) Ну и насчет авторизации. Опять же хочется самому создать поля в users связанные таблицы итд. Опять же какие тут подводные камни?
В общем то использовать фреймворк решили ради эксперимента в одном небольшом новом проекте. Времени мало. Если ничего не получится, придется опять на чистом php писать..
Все возможности фреймворка трудно сразу освоить и возможно и не нужны, но хочется хотя бы шаг в направлении сделать и получить каркас для проекта...
Как думаете реально за неделю на таком уровне разобраться?