Возможно ли сделать сокращенную запись для if в данном случае?
подскажите пожалуйста возможно ли сделать сокращенные записи для if?
public function create(Request $request)
{
$categoryIds = $request->get('categories');
$attributes = $request->get('attributes');
if ($categoryIds) {
$request->session()->flash('category', end($categoryIds));
}
if ($attributes) {
$request->session()->flash('attributes', $attributes);
}
$validator = Validator::make($request->all(), [
'title' => 'required',
'price' => 'required',
'categories' => 'present|array',
'attributes' => 'present|array',
]);
if ($validator->fails()) {
return redirect()->route('welcome');
}
return redirect()->route('welcome')->with('success', 'Создание прошло успешно');
}
Ответы (3 шт):
Нет никакой "сокращенной записи для if". Это заблуждение, по какой-то причине очень распространённое.
Есть тернарный оператор, который реализует очень ограниченную функциональность, которую можно сформулировать как присвоение значения по результатам условия.
Использовать его в данном коде можно, но не нужно - это ухудшит читабельность.
Ну, предположим, вот:
public function create(Request $request) {
$categoryIds = $request->get('categories');
$attributes = $request->get('attributes');
$categoryIds && $request->session()->flash('category', end($categoryIds));
$attributes && $request->session()->flash('attributes', $attributes);
$validator = Validator::make($request->all(), [
'title' => 'required',
'price' => 'required',
'categories' => 'present|array',
'attributes' => 'present|array',
]);
return $validator->fails()
? redirect()->route('welcome')
: redirect()->route('welcome')->with('success', 'Создание прошло успешно');
}
Можно, есесна, упороться и сделать вот так:
CategoryRequest.php
use Illuminate\Foundation\Http\FormRequest;
class CategoryRequest extends FormRequest
{
/**
* The URI to redirect to if validation fails.
*
* @var string
*/
protected $redirect = '/';
/**
* 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 [
'title' => 'required',
'price' => 'required',
'categories' => 'present|array',
'attributes' => 'present|array',
];
}
}
HasCategory.php
use Closure;
use Illuminate\Validation\ValidationException;
class HasCategory
{
public function handle($request, Closure $next)
{
if ($request->get('categories')) {
$request->session()->flash('category', end($request>get('categories')));
}
return $next($request);
}
}
HasAttribute.php
use Closure;
use Illuminate\Validation\ValidationException;
class HasAttribute
{
public function handle($request, Closure $next)
{
if ($request->get('attributes')) {
$request->session()->flash('attributes', end($request>get('attributes')));
}
return $next($request);
}
}
контроллер
use Illuminate\Pipeline\Pipeline;
protected $store = [
HasAttribute::class,
HasCategory::class
];
public function create(CategoryRequest $request, Pipeline $pipeline)
{
$pipeline->send($request)->through($this->store)->thenReturn();
}
Что сделано?
- Выкинули валидацию в отдельную сущность
- Опрокидываем флэш через пайпы
Пайпы толком не описаны в доке, но про Request можно почитать.
Нужно еще подправить вывод алертов и неймспейсики подставить, та и усе