Laravel по-русски

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

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

#176 Re: Laravel 5.x » Помогите новичку при разработке форм » 15.03.2016 22:15:23

Каким то чудесным образом все это пофиксилось..
Данные о юзере получаю в контроллере и шаблоне через Auth::user()

#178 Re: Laravel 5.x » Помогите новичку при разработке форм » 14.03.2016 19:38:42

Скорее нахожу примеры как не пускать не авторизованного в какой то раздел.. Понятно, что может и это понадобится и пускать, но показывать что авторизован..

#179 Re: Laravel 5.x » Помогите новичку при разработке форм » 14.03.2016 19:37:45

Да я не в той версии смотрел. Не думал, что разница столь существенна и касается именно такого момента.

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

#180 Re: Laravel 5.x » Помогите новичку при разработке форм » 13.03.2016 23:42:52

Заработало ответ тут http://stackoverflow.com/questions/3597 … how-errors

Нужен был web middleware для показа ошибок при возрате в форму.

Непонятно почему это совсем нигде не указывается в документации про валидацию.

#181 Re: Laravel 5.x » Помогите новичку при разработке форм » 13.03.2016 19:40:04

Попробовал создать форму заново на основе почти чистого примера из документации 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)

Возможно, что то не то в настройках приложения в целом?

#182 Re: Laravel 5.x » Помогите новичку при разработке форм » 13.03.2016 19:21:01

Ну что никто ничего не скажет... Уже хочется отказаться от использования фреймворка..
Ошибка на ровном месте в общем то.

#183 Re: Laravel 5.x » Помогите новичку при разработке форм » 13.03.2016 16:19:10

Может быть проблема все же в запросе?

Форма вот такая привожу полностью

@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

#184 Re: Laravel 5.x » Помогите новичку при разработке форм » 13.03.2016 16:18:02

ErrorException in RegistController.php line 38: Undefined property: Illuminate\Validation\Validator::$errors

это на второй вариант ругается с make

#185 Re: Laravel 5.x » Помогите новичку при разработке форм » 13.03.2016 16:11:33

Да я уже даже другой контроллер создал и нет отдельного метода 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, не в контроллере

#186 Re: Laravel 5.x » Помогите новичку при разработке форм » 12.03.2016 23:46:29

Попробовал переделать участок кода где проверка так:

$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" => ""
]

То есть вообще пустые поля засылаю. А ошибки нет.. Почему?

#187 Laravel 5.x » Помогите новичку при разработке форм » 12.03.2016 22:34:40

htclog81
Ответов: 14

Не могу получить ошибки от валидатора

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);

и тоже ничего

#188 Re: Laravel 5.x » Вопрос от новичка не могу вывести в шаблоне результат raw select » 12.03.2016 19:41:00

>У вас форич возвращает объекты. А вы к ним как к массивам обращаетесь.

пофиксилось..

#189 Re: Laravel 5.x » Вопрос от новичка не могу вывести в шаблоне результат raw select » 12.03.2016 18:44:17

А по теорическим вопросам. Прежде всего сложные запросы и формы кто нибудь может подсказать простые практики, так же бы не углуюлятся сильно в active record orm итд.

#190 Re: Laravel 5.x » Вопрос от новичка не могу вывести в шаблоне результат raw select » 12.03.2016 18:35:11

ага то есть при raw sql структура коллекции с результатами немного другая?

#191 Laravel 5.x » Вопрос от новичка не могу вывести в шаблоне результат raw select » 12.03.2016 17:37:10

htclog81
Ответов: 4

Всем привет!
Изучаю 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 писать..
Все возможности фреймворка трудно сразу освоить и возможно и не нужны, но хочется хотя бы шаг в направлении сделать и получить каркас для проекта...
Как думаете реально за неделю на таком уровне разобраться?

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