我有两个表,第一个是用户表,其中有这些属性id,用户名,电子邮件,remember_token,createdat,updateat另一个表叫做receive_pay有id,email,token我的任务是查看是否有电子邮件,以及用户输入的令牌必须与received_pay中的令牌匹配,否则不会创建新用户,感谢您的高级时间,
我尝试创建新用户的条件是,如果另一个表中有数据,则创建新用户,否则不会将我的代码放入if else语句中,并且会抛出错误。
我创建新用户的功能如下:
protected function create(array $data)
{
/*$exists = \DB::table('received_pay')->where('email', $data['email'])->first(); */
$exists=\DB::table('received_pay')->where('email', '=', $data['email'])->where('token', $data['token'])->exists();
if ($exists === null)
{
// user doesn't exist
return User::create([
'username' => $data['username'],
'email' => $data['email'],
'password' => bcrypt($data['password']),
'token' => $data['token'],
]);
}
else
{
return null;
}
}
答案 0 :(得分:0)
如果您希望使用if语句执行此操作,请执行以下操作
protected function create(array $data)
{
/*$exists = \DB::table('received_pay')->where('email', $data['email'])->first(); */
$exists=\DB::table('received_pay')->where('email', '=', $data['email'])->where('token', $data['token']);
if (!$exists->count())
{
// user doesn't exist
return User::create([
'username' => $data['username'],
'email' => $data['email'],
'password' => bcrypt($data['password']),
'token' => $data['token'],
]);
}
else
{
return null;
}
}
if中的count()
如果数据存在则使语句评估为true,否则为false,并创建新用户。
我认为这可以解决您的问题。
答案 1 :(得分:0)
我认为Laravel中最好的方法是创建一个中间件来保护这个URL。如果您已经拥有此create user
功能,那么最好不要对其进行修改。
所以第一步是创建一个中间件(https://laravel.com/docs/5.5/middleware)来添加你的安全措施,如下所示:
<?php
namespace App\Http\Middleware;
use Closure;
class CheckPayment
{
public function handle($request, Closure $next)
{
$payment = \DB::table('received_pay')->where('email', $request->email)->where('token', $request->token]);
if (!$payment->count()) {
return redirect('no-payment');
}
return $next($request);
}
}
然后你需要创建一个路由来处理这个无效的创建用户(这个no-payment
url)。
最后,您可以通过在kernel.php
文件中添加中间件来保护您的创建用户网址...
protected $routeMiddleware = [
...
'payment' => \App\Http\Middleware\CheckPayment::class,
];
并在您的web.php
路径文件中:
Route::post('user', 'UserController@create')->middleware('payment');
通过这种方式,您的代码看起来更干净,更整洁,更接近Laravel的工作方式。
我希望它对你有用。