簡體   English   中英

Laravel新的中間件不起作用

[英]Laravel new middleware does not work

我正在創建簡單的推薦系統。 我已經完成工作,但是推薦系統似乎無法正常工作,很可能是由於中間件所致。 我將更清楚地解釋這個問題。

所以,這是我的寄存器控制器

protected function create(array $data)
{
    $referred_by = Cookie::get('referral');

    return User::create([
        'name' => $data['name'],
        'email' => $data['email'],
        'password' => bcrypt($data['password']),
        'affiliate_id' => str_random(10),
        'referred_by'   => $referred_by
    ]);
}

和中間件

<?php
namespace App\Http\Middleware;

use Illuminate\Http\Response;

use Closure;

class CheckReferral
{
/**
 * Handle an incoming request.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  \Closure  $next
 * @return mixed
 */
public function handle($request, Closure $next)
{
    if( $request->hasCookie('referral')) {
        return $next($request);
    }
    else {
        if( $request->query('ref') ) {
            return redirect($request->fullUrl())-
    >withCookie(cookie('referral', $request->query('ref'), 30));
        }
    }
    return $next($request);
    }
}

我還向內核添加了中間件

protected $middleware = [
    \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
    \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
    \App\Http\Middleware\TrimStrings::class,
    \App\Http\Middleware\CheckReferral::class, 
    \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
];

因此,所有用戶都獲得afflitiate_id ,但是他們在數據庫中都沒有reference_by

編輯:整個注冊控制器

<?php

namespace App\Http\Controllers\Auth;

use App\Http\Requests; 
use Illuminate\Http\Request;
use DB;
use App\User;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Validator;
use Illuminate\Foundation\Auth\RegistersUsers;
use Cookie;

class RegisterController extends Controller
{
/*
|--------------------------------------------------------------------------
| Register Controller
|--------------------------------------------------------------------------
|
| This controller handles the registration of new users as well as their
| validation and creation. By default this controller uses a trait to
| provide this functionality without requiring any additional code.
|
*/

use RegistersUsers;

/**
 * Where to redirect users after registration.
 *
 * @var string
 */
protected $redirectTo = '/dashboard';

/**
 * Create a new controller instance.
 *
 * @return void
 */
public function __construct()
{
    $this->middleware('guest');
}

/**
 * Get a validator for an incoming registration request.
 *
 * @param  array  $data
 * @return \Illuminate\Contracts\Validation\Validator
 */
protected function validator(array $data)
{
    return Validator::make($data, [
        'name' => 'required|string|max:255',
        'email' => 'required|string|email|max:255|unique:users',
        'password' => 'required|string|min:6|confirmed',
    ]);
}

/**
 * Create a new user instance after a valid registration.
 *
 * @param  array  $data
 * @return \App\User
 */
protected function create(array $data, Request $request)
{
    $referred_by = $request->cookie('referral');

    return User::create([
        'name' => $data['name'],
        'email' => $data['email'],
        'password' => bcrypt($data['password']),
        'affiliate_id' => str_random(10),
        'referred_by' => $referred_by
    ]);
}
}

我看到您的中間件沒有問題。 您需要更改在控制器中獲取Cookie的方式:

protected function create(array $data, Request $request)  // Adding request as an argument.
{
    $referred_by = $request->cookie('referral');  // Notice the change here

    return User::create([
        'name' => $data['name'],
        'email' => $data['email'],
        'password' => bcrypt($data['password']),
        'affiliate_id' => str_random(10),
        'referred_by'   => $referred_by
    ]);
}

該解決方案實際上非常簡單。 \\ App \\ Http \\ Middleware \\ CheckReferral :: class,應該到$ middlewareGroups網站而不是$ middleware。 這樣應用程序將能夠捕獲引薦鏈接並將其存儲在cookie中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM