2015-06-26 2 views
3

Возможно ли создать перенаправление из функции authorize() по запросу? Я пробовал следующий код, но он не выполняет запрос на перенаправление. Может ли кто-нибудь пролить свет на это?Переадресация Laravel-5 в функции authorize() по запросам формы

Спасибо.

<?php 

namespace App\Http\Requests; 

use App\Http\Requests\Request; 
use App\Reserve; 
use Cookie; 
use Config; 

class ClassVoucherCheckoutRequest extends Request 
{ 
    /** 
    * Determine if the user is authorized to make this request. 
    * 
    * @return bool 
    */ 
    public function authorize(Reserve $reserve, Cookie $cookie) 
    { 
     if((!$cookie->has(Config::get('app.cookie_name'))) || ($reserve->where('cookie_id', $cookie->get(Config::get('app.cookie_name')))->count() == 0)) 
     { 
      return redirect()->to('butchery-voucher')->withErrors('Your reservation has expired. Places can only be held for up to 30 minutes.'); 
     } 

     return true; 
    } 

    /** 
    * Get the validation rules that apply to the request. 
    * 
    * @return array 
    */ 
    public function rules() 
    { 
     return [ 

     ]; 
    } 
} 
+0

Я понятия не имею, действительно ли это ваша проблема, но вы не можете отправить перенаправление HTTP после отправки небольшого количества контента. Поэтому, если код появляется после тега '' или, возможно, только пробела перед ''? Php', или 'echo', это не сработает. – Anders

+0

У меня тот же вопрос –

+0

Имейте в виду, что функция авторизации вовсе не предназначена для этой цели. Как вы можете видеть в блоке doc, он должен возвращать логическое значение true или false. False в случае, если вызывающему пользователю вообще не разрешено запускать этот запрос. В вашем случае это зависит от некоторых значений cookie, поэтому вы должны затронуть эту проблему либо на уровне промежуточного слоя, либо на уровне пользовательской проверки. –

ответ

2

У меня также есть один и тот же вопрос, я не нашел решение, но пока у меня есть это сделать с помощью другого пути, я знаю, что это не является правильным решением, но может быть помощь в настоящее время.

Моя проблема: мне нужно зарегистрировать пользователя, если какой-либо другой пользователь с тем же fb_id в базе данных не существует. Но я не смог проверить это условие, потому что middelware выполняется перед контроллером, и он возвращает мне уже принятую ошибку fb_id.

Это мой UserController:

public function createUser (UserRequest $request) { 

/** here I need to redirect user if the given `fb_id` is already exists 
    before it was always returning the `fb_id` exists error before executing 
    the following code, because all input filtered by the `UserRequest` middleware 
    I have changed the `UserRequest.php` to execute the following code. 
**/ 
     $fb_id = Input::get('fb_id'); 
     $user = $this->user->getUserWhereFbIdIn([$fb_id]); 

     if(sizeof($user) > 0){ 
      return Response::json(['result' => true, 'error' => false, 'message' => 'User exists', 'data' => $user]); 
     } 


     // insert user code is here 
    } 

UserRequest.php:

public function authorize() 
{ 
    return true; 
} 


public function rules() 
{ 
    $fb_id = Input::get('fb_id'); 
    $user = User::where('fb_id', $fb_id)->get()->toArray(); 

    if(sizeof($user) > 0){ 
     return []; 
    } 
    return [ 
     'fb_id' => 'required|unique:users', 
     'username' => 'required|unique:users', 
     'email' => 'required|unique:users', 
     'image' => 'required', 
     'device_id' => 'required', 
     'status' => 'required', 
    ]; 
} 
+0

Это работает! (+1 для этого), но почему-то это не кажется мне «чистым» ... По крайней мере, у вас есть дублированный код. Я думаю, что вместо этого я поеду с помощью специального промежуточного программного обеспечения. –

+0

Да, я знаю, что это не лучшее решение этой проблемы, я пытаюсь решить это пропаратично, но это может занять некоторое время, и до этого мы можем это использовать. –

0

Я думаю, самое элегантное решение, чтобы сделать authorize() возвращение false, когда вы хотите перенаправить , и переопределить метод forbiddenResponse() класса FormRequest. Недостатком является то, что вам придется либо дважды выполнить логику состояния, либо задать переменную состояния.

class MyRequest extends FormRequest 
{ 
    public function authorize(): bool 
    { 
     return Auth::user()->hasNoEmail() ? false : true; 
    } 

    public function forbiddenResponse(): Response 
    { 
     if Auth::user()->hasNoEmail() return redirect(route('user.should_provide_email')); 

     return parent::forbiddenResponse(); 
    } 

    public function rules(): array 
    { 
     return []; 
    } 
} 

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

Смежные вопросы