Мне было интересно, что лучше всего будет добавить или настроить некоторые функции для установленных пакетов. Я думаю, что расширение существующих классов звучало как хорошая идея, когда я начал это, но похоже, что небольшое добавление, по-видимому, приводит к множеству дополнений. Будет ли это правильным путем, и каков следующий шаг?
Например, я использую пакет Laravel / Passport. Не вдаваясь в подробности о том, почему пользователь с клиентом может отправить электронное письмо, чтобы пригласить другого пользователя. Этот пользователь может принять приглашение, когда он или она вошли в систему. Для этого я создал следующую миграцию.
<?php use Illuminate\Support\Facades\Schema; use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class CreateInvitationRequestsTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('oauth_invitation_requests', function (Blueprint $table) { $table->increments('id'); $table->integer('client_id')->index(); $table->string('name'); $table->string('email'); $table->boolean('accepted'); $table->boolean('declined'); $table->boolean('revoked'); $table->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('oauth_invitation_requests'); } }
И следующая модель
<?php namespace App; use Laravel\Passport\Client; use Illuminate\Database\Eloquent\Model; class InvitationRequest extends Model { /** * The database table used by the model. * * @var string */ protected $table = 'oauth_invitation_requests'; /** * The guarded attributes on the model. * * @var array */ protected $guarded = []; /** * Get all of the invitation requests for the client. * * @return \Illuminate\Database\Eloquent\Relations\BelongsTo */ public function client() { return $this->belongsTo(Client::class); } }
При изучении кода \ Laravel \ Passport \ ClientRepository я замечаю следующий фрагмент кода
<?php namespace Laravel\Passport; class ClientRepository { ... /** * Delete the given client. * * @param \Laravel\Passport\Client $client * @return void */ public function delete(Client $client) { $client->tokens()->update(['revoked' => true]); $client->forceFill(['revoked' => true])->save(); } }
Поэтому, когда клиент удален, все токены также аннулируются. То же самое должно произойти с соответствующими запросами на приглашение. Поэтому я добавил следующие два класса
<?php namespace App; use Laravel\Passport\Client; use Illuminate\Database\Eloquent\Model; class PassportClient extends Client { /** * Get all of the invitation requests from the client. * * @return \Illuminate\Database\Eloquent\Relations\HasMany */ public function invitationRequests() { return $this->hasMany(InvitationRequest::class, 'client_id'); } }
а также
<?php namespace App; use App\PassportClient; use Laravel\Passport\ClientRepository; class PassportClientRepository extends ClientRepository { /** * Delete the given client. * * @param App\Client $client * @return void */ public function delete(PassportClient $client) { $client->invitationRequests()->update(['revoked' => true]); parent::delete($client); } }
Я думаю, что мне тоже понадобится этот
<?php namespace App\Http\Controllers; use App\PassportClientRepository; use Laravel\Passport\Http\Controllers\ClientController; class PassportClientController extends ClientController { /** * Create a client controller instance. * * @param \Laravel\Passport\ClientRepository $clients * @param \Illuminate\Contracts\Validation\Factory $validation * @return void */ public function __construct(PassportClientRepository $clients, ValidationFactory $validation) { $this->clients = $clients; $this->validation = $validation; } }
До сих пор так хорошо, я бы подумал? Но теперь я немного застрял. В соответствии с документацией мне пришлось добавить Passport :: routes (); в AuthServiceProvider, который загружает маршруты. Я предполагаю, что я должен перезаписать поведение только для одного маршрута, и это будет следующим.
+--------+----------+-----------------------------------------+------------------+----------------------------------------------------------------------------+--------------+ | Domain | Method | URI | Name | Action | Middleware | +--------+----------+-----------------------------------------+------------------+----------------------------------------------------------------------------+--------------+ | | DELETE | oauth/clients/{client_id} | | \Laravel\Passport\Http\Controllers\ClientController@destroy | web,auth | +--------+----------+-----------------------------------------+------------------+----------------------------------------------------------------------------+--------------+
Я немного смущен тем, как Laravel загружает маршруты точно, и я не уверен, какой класс я должен унаследовать дальше, чтобы сделать эту работу.