BG Development


Страници: (2) [1] 2   ( Първото ново мнение ) Reply to this topicStart new topicStart Poll

> Проблем с елементарна валидация в Laravel
yoyovec
Публикувано на: 07-12-2017, 22:01
Quote Post



Име:
Група: Потребител
Ранг: Активен

Мнения: 240
Регистриран на: 28.08.05



Направил съм си request, който да проверява дали въведеното id е число.

CODE

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class RequestValidId extends FormRequest
{
   /**
    * Determine if the user is authorized to make this request.
    *
    * @return bool
    */
   public function authorize()
   {
       return true;
   }

   /**
    * Get the validation rules that apply to the request.
    *
    * @return array
    */
   public function rules()
   {
       return [
           'id' => 'numeric'
       ];
   }
}



Това ми е рутера:

CODE

Route::get('/league/show/{id}', 'LeagueController@show');


А това ми е в контролера:

CODE

   public function show(RequestValidId $request)
   {
       $this->data = $this->league->with('teams')->find($request->id);
       return view("league.show", ['league' => $this->data]);
   }


Ако правилно съм прочел, ако валидацията не мине, кода в контролера изобщо няма да се изпълни. Ама се изпълнява, което значи, че не работи, или по-точно аз не правя нещо като хората.

Идеята е, че този линк

http://manarche-goldcup.ml/league/show/1dfkdhf

изпълнява същото като този

http://manarche-goldcup.ml/league/show/1

А аз искам като параметър да се предава само число.


PMEmail Poster
Top
rvc
Публикувано на: 07-12-2017, 22:27
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 2541
Регистриран на: 13.05.11



вероятно ще трябва с някакъв регулярен израз да "изрежеш" само числото и да го подадеш към контролера.
PMEmail PosterUsers Website
Top
yoyovec
Публикувано на: 07-12-2017, 22:33
Quote Post



Име:
Група: Потребител
Ранг: Активен

Мнения: 240
Регистриран на: 28.08.05



Ама Laravel-a точно това прави - изрязва само числото ако е в началото и заявката си се изпълнява коректно. Аз искам обаче, ако не е подадено число, ами някакъв стринг с число - изобщо да не се изпълнява заявката.

Бях го направил с ctype_digit в самия контролер, ама исках да го направя, както трябва с инструментите на Ларавел...уви не става.
PMEmail Poster
Top
yoyovec
Публикувано на: 07-12-2017, 23:32
Quote Post



Име:
Група: Потребител
Ранг: Активен

Мнения: 240
Регистриран на: 28.08.05



Намерих решение - проверката се прави в самия Route:

CODE
Route::get('/league/show/{id}', 'LeagueController@show')->where('id','[1-9][0-9]*');


Сега всичко работи според очакванията.
PMEmail Poster
Top
purjola
Публикувано на: 08-12-2017, 00:11
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 2167
Регистриран на: 18.10.11



Тия вградените функции на езика не ти ли вършат работа?
gettype()
is_int()
is_numeric()
PMEmail Poster
Top
escapeboy
Публикувано на: 08-12-2017, 10:26
Quote Post



Име: Никола Кацаров
Група: Потребител
Ранг: Редовен член

Мнения: 422
Регистриран на: 04.12.04



За да не го пишеш на всеки route използвай RouteServiceProvider
CODE

public function boot()
{
   Route::pattern('id', '[0-9]+');

   parent::boot();
}


--------------------
PMEmail PosterUsers Website
Top
yoyovec
Публикувано на: 08-12-2017, 10:58
Quote Post



Име:
Група: Потребител
Ранг: Активен

Мнения: 240
Регистриран на: 28.08.05



QUOTE (escapeboy @ 08-12-2017, 10:26)
За да не го пишеш на всеки route използвай RouteServiceProvider
CODE

public function boot()
{
   Route::pattern('id', '[0-9]+');

   parent::boot();
}

Така няма ли да го проверява всеки път, дори и рутера да няма Ид като параметър?
PMEmail Poster
Top
relax4o
Публикувано на: 08-12-2017, 15:53
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 2193
Регистриран на: 04.04.07



QUOTE (yoyovec @ 08-12-2017, 10:58)
QUOTE (escapeboy @ 08-12-2017, 10:26)
За да не го пишеш на всеки route използвай RouteServiceProvider
CODE

public function boot()
{
   Route::pattern('id', '[0-9]+');

   parent::boot();
}

Така няма ли да го проверява всеки път, дори и рутера да няма Ид като параметър?

Не, това означава, че всичко, което е в boot-а ще се извика веднага след като Route сървиса бъде зареден от Ларавел(config/app.php -> $providers) и ще започне да "слуша" за id wildcard.


Между другото, във валидацията винаги можеш да ползваш regex филтъра:

CODE

$rules = [
   'id' => 'regex:[0-9]+'
];


Това мнение е било редактирано от relax4o на 08-12-2017, 16:13


--------------------
Бисери :D

QUOTE (oveRLuckEd)
Ползваш някоя нова версия на PHP, която е вече ооп ориентирана и заради това ти я изкарва тази грешка.


QUOTE (nbacool2)
Щом няма input полета, значи няма откъде да се направи SQL инжекция Very Happy
PM
Top
yoyovec
Публикувано на: 08-12-2017, 17:09
Quote Post



Име:
Група: Потребител
Ранг: Активен

Мнения: 240
Регистриран на: 28.08.05



Благодаря, разбрах! А от чисто любопитство, знаете ли защо варианта, който дадох в началото не работи?
PMEmail Poster
Top
relax4o
Публикувано на: 08-12-2017, 19:48
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 2193
Регистриран на: 04.04.07



QUOTE (yoyovec @ 08-12-2017, 17:09)
Благодаря, разбрах! А от чисто любопитство, знаете ли защо варианта, който дадох в началото не работи?

Той работи. Де факто Ларавел за филтъра numeric, каства получения стринг към число, а при кастване се случва това в PHP:

Ако в началото на низа се съдържа число, го взима и изчиства всичко останало след него
CODE

$numeric_string = (int)"5asdasd"; // 5 (true)

$another_numeric_string = (int)"asda5"; // 0 (false)


Ако в началото не е число го каства към 0 (false), но ако по някаква случайност в базата имаш ID=0 ще ти зареди него, за това не е добре да се държат нулеви идентификатори в базата.


--------------------
Бисери :D

QUOTE (oveRLuckEd)
Ползваш някоя нова версия на PHP, която е вече ооп ориентирана и заради това ти я изкарва тази грешка.


QUOTE (nbacool2)
Щом няма input полета, значи няма откъде да се направи SQL инжекция Very Happy
PM
Top
0 потребители преглеждат тази тема в момента (0 гости, 0 анонимни потребители)
Потребители, преглеждащи темата в момента:

Topic Options Страници: (2) [1] 2  Reply to this topicStart new topicStart Poll

 


Copyright © 2003-2018 | BG Development | All Rights Reserved
RSS 2.0