Я хочу реализовать проверку номера телефона с помощью laravel, twilio и authy api.
Я следил за инструкциями, представленными на сайте https://www.twilio.com/docs/sms, но он продолжает показывать мне эту ошибку.
Unresolvable dependency resolving [Parameter #0 [ $api_key ]] in class Authy\AuthyApi
Это моя пользовательская модель:
<?php
namespace App;
use Illuminate\Auth\Authenticatable;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Auth\Passwords\CanResetPassword;
use Illuminate\Foundation\Auth\Access\Authorizable;
use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract;
use Illuminate\Contracts\Auth\Access\Authorizable as AuthorizableContract;
use Illuminate\Contracts\Auth\CanResetPassword as CanResetPasswordContract;
class User extends Model implements AuthenticatableContract,
AuthorizableContract,
CanResetPasswordContract
{
use Authenticatable, Authorizable, CanResetPassword;
/**
* The database table used by the model.
*
* @var string
*/
protected $table = 'users';
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = ['name', 'email', 'password', 'country_code', 'phone_number'];
/**
* The attributes excluded from the model's JSON form.
*
* @var array
*/
protected $hidden = ['password', 'remember_token'];
public function fullNumber()
{
return '+' . $this->country_code . $this->phone_number;
}
}
Мой контроллер:
<?php
namespace App\Http\Controllers;
use App\Http\Requests;
use App\User;
use Auth;
use Authy\AuthyApi as AuthyApi;
use DB;
use Hash;
use Illuminate\Contracts\Auth\Authenticatable;
use Illuminate\Http\Request;
use Illuminate\Support\MessageBag;
use Twilio\Rest\Client;
class UserController extends Controller
{
/**
* Store a new user
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function createNewUser(Request $request, AuthyApi $authyApi)
{
$this->validate(
$request, [
'name' => 'required|string',
'email' => 'required|unique:users|email',
'password' => 'required',
'country_code' => 'required',
'phone_number' => 'required|numeric'
]
);
$values = $request->all();
$values['password'] = Hash::make($values['password']);
DB::beginTransaction();
$newUser = new User($values);
$newUser->save();
Auth::login($newUser);
$authyUser = $authyApi->registerUser(
$newUser->email,
$newUser->phone_number,
$newUser->country_code
);
if ($authyUser->ok()) {
$newUser->authy_id = $authyUser->id();
$newUser->save();
$request->session()->flash(
'status',
"User created successfully"
);
$sms = $authyApi->requestSms($newUser->authy_id);
DB::commit();
return redirect()->route('user-show-verify');
} else {
$errors = $this->getAuthyErrors($authyUser->errors());
DB::rollback();
return view('newUser', ['errors' => new MessageBag($errors)]);
}
}
/**
* This controller function shows the current user status
*
* @param Authenticatable $user Current user
* @return mixed Response view
*/
public function show(Authenticatable $user)
{
return view('showUser', ['user' => $user]);
}
/**
* This controller function handles the submission form
*
* @param Request $request Current User Request
* @param Authenticatable $user Current User
* @param AuthyApi $authyApi Authy Client
* @return mixed Response view
*/
public function verify(Request $request, Authenticatable $user,
AuthyApi $authyApi, Client $client)
{
$token = $request->input('token');
$verification = $authyApi->verifyToken($user->authy_id, $token);
if ($verification->ok()) {
$user->verified = true;
$user->save();
$this->sendSmsNotification($client, $user);
return redirect()->route('user-index');
} else {
$errors = $this->getAuthyErrors($verification->errors());
return view('verifyUser', ['errors' => new MessageBag($errors)]);
}
}
/**
* This controller function handles the verification code resent
*
* @param Request $request Current User Request
* @param Authenticatable $user Current User
* @param AuthyApi $authyApi Authy Client
* @return mixed Response view
*/
public function verifyResend(Request $request, Authenticatable $user,
AuthyApi $authyApi)
{
$sms = $authyApi->requestSms($user->authy_id);
if ($sms->ok()) {
$request->session()->flash(
'status',
'Verification code re-sent'
);
return redirect()->route('user-show-verify');
} else {
$errors = $this->getAuthyErrors($sms->errors());
return view('verifyUser', ['errors' => new MessageBag($errors)]);
}
}
private function getAuthyErrors($authyErrors)
{
$errors = [];
foreach ($authyErrors as $field => $message) {
array_push($errors, $field . ': ' . $message);
}
return $errors;
}
private function sendSmsNotification($client, $user)
{
$twilioNumber = config('services.twilio')['number'] or die(
"TWILIO_NUMBER is not set in the environment"
);
$messageBody = 'You did it! Signup complete :)';
$client->messages->create(
$user->fullNumber(), // Phone number which receives the message
[
"from" => $twilioNumber, // From a Twilio number in your account
"body" => $messageBody
]
);
}
}
файл миграции:
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateUsersTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->string('email',191)->unique();
$table->string('password', 60);
$table->string('phone_number');
$table->string('country_code');
$table->string('authy_id')->nullable();
$table->boolean('verified')->default(false);
$table->rememberToken();
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('users');
}
}
Провайдеры
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use Services_Twilio;
use Twilio\Rest\Client;
class TwilioRestClientProvider extends ServiceProvider
{
/**
* Register the application services.
*
* @return void
*/
public function register()
{
$this->app->singleton(Client::class, function ($app) {
$accountSid = config('services.twilio')['accountSid']
or die("TWILIO_ACCOUNT_SID is not set in the environment");
$authToken = config('services.twilio')['authToken']
or die("TWILIO_AUTH_TOKEN is not set in the environment");
return new Client($accountSid, $authToken);
});
}
}
<?php
namespace App\Providers;
use Authy\AuthyApi as AuthyApi;
use Illuminate\Support\ServiceProvider;
class AuthyApiProvider extends ServiceProvider
{
/**
* Register the application services.
*
* @return void
*/
public function register()
{
$this->app->singleton(AuthyApi::class, function ($app) {
$authyKey = getenv('AUTHY_API_KEY') or die(
"You must specify your api key for Authy. " .
"Visit https://dashboard.authy.com/"
);
return new AuthyApi($authyKey);
});
}
}
файл представления
@extends('layouts.master')
@section('title')
Sign Up
@endsection
@section('content')
<div class = "container">
<h1>We're going to be *BEST* friends</h1>
<p> Thanks for your interest in signing up! Can you tell us a bit about yourself?</p>
{!! Form::open(['url' => route('user-create')]) !!}
<div class = "form-group">
{!! Form::label('name') !!}
{!! Form::text('name', '', ['class' => 'form-control', 'placeholder' => 'Zingelbert Bembledack']) !!}
</div>
<div class = "form-group">
{!! Form::label('email') !!}
{!! Form::text('email', '', ['class' => 'form-control', 'placeholder' => '[email protected]']) !!}
</div>
<div class = "form-group">
{!! Form::label('password') !!}
{!! Form::password('password', ['class' => 'form-control']) !!}
</div>
<div class = "form-group">
{!! Form::label('country_code', 'Country Code') !!}
{!! Form::text('country_code', '', ['class' => 'form-control', 'id' => 'authy-countries']) !!}
</div>
<div class = "form-group">
{!! Form::label('phone_number', 'Phone number') !!}
{!! Form::text('phone_number', '', ['class' => 'form-control', 'id' => 'authy-cellphone']) !!}
</div>
<div class = "form-group">
<button type = "submit" class = "btn btn-primary">Sign up</button>
</div>
{!! Form::close() !!}
</div>
@endsection
Файл среды
APP_NAME=Laravel
APP_ENV=local
APP_KEY=
APP_DEBUG=true
APP_URL=http://localhost
LOG_CHANNEL=stack
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=vmsdb
DB_USERNAME=root
DB_PASSWORD=
# Twilio API credentials
# Found at https://www.twilio.com/user/account/settings
TWILIO_ACCOUNT_SID=
TWILIO_AUTH_TOKEN=
# Twilio phone number
# Purchase one at https://www.twilio.com/user/account/phone-numbers
TWILIO_NUMBER=
# Authy Credentials
AUTHY_API_KEY=
BROADCAST_DRIVER=log
CACHE_DRIVER=file
QUEUE_CONNECTION=sync
SESSION_DRIVER=file
SESSION_LIFETIME=120
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
MAIL_DRIVER=smtp
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_DEFAULT_REGION=us-east-1
AWS_BUCKET=
PUSHER_APP_ID=
PUSHER_APP_KEY=
PUSHER_APP_SECRET=
PUSHER_APP_CLUSTER=mt1
MIX_PUSHER_APP_KEY = "${PUSHER_APP_KEY}"
MIX_PUSHER_APP_CLUSTER = "${PUSHER_APP_CLUSTER}"
Но продолжает показывать ошибку:
Unresolvable dependency resolving [Parameter #0 [ <required> $api_key ]] in class Authy\AuthyApi
И мне потребовались как authy, так и twilio из пакета composer, но он все еще показывает ту же ошибку, пожалуйста, мне нужна помощь. Спасибо






Пожалуйста, удалите свои учетные данные, когда делитесь своим проектом!
Похоже, вы пытаетесь использовать getenv() для извлечения информации из файла .env, но это не способ Laravel сделать это, и это может вызвать проблемы (https://laracasts.com/discuss/channels/laravel/cant-get-getenvkey?page=1).
Я рекомендую настроить эти значения в config/services.php, а затем получить их с помощью метода Laravel config() (https://laravel.com/docs/5.8/конфигурация).
Таким образом, ваш config/services.php будет выглядеть примерно так:
return [
'authy' => [
'key' => env('AUTHY_API_KEY'),
],
];
а затем получение ключа API будет выглядеть примерно так:
config('services.authy.key');
О, хорошо, пусть встретится, попробуем и посмотрим. Пожалуйста, просто уточните, я должен добавить возврат [...] в config/services.php, тогда вместо использования getenv('AUTHY_API_KEY') в классе провайдера я должен добавить это config('services.authy.key');, верно?
$authyApi = новый AuthyApi(config('services.authy.key'));
Привет, Римзи! Евангелист разработчиков Twilio здесь - ответ Маргарет ниже должен помочь с вашей проблемой учетных данных. Также хотел бы сообщить вам, что сегодня мы выпускаем новую версию Verify API, в которой используется вспомогательная библиотека Twilio PHP, которая лучше поддерживается, чем старая Authy. Проверьте это twilio.com/docs/verify/api-бета и дайте мне знать, если у вас есть какие-либо вопросы! [email protected]