, et le nom codé de l'équipe et le bouton de participation doivent être affichés en même temps. Cependant, la logique de l'interface est d'afficher directement 您不是 [xxxxxx] 团队的成员,暂时无法查看,可589dbe80f52208edfac91e23a0ccf85e
lorsqu'il n'y a pas d'autorisation : <.>
abort_if(!$user->isMember($resouce->team), 403, '您无权访问该资源');
abort
Le résultat de la réponse obtenue est le suivant : HTTP/1.0 403 Forbidden{ "message": "您无权访问该资源"}
Il nous est impossible d'utiliser du HTML pour afficher la page d'invite du front-end pour les messages. Cela serait trop couplé et violerait le principe de. séparation front-end et back-end. Notre objectif est de renvoyer le format suivant pour résoudre le problème :
HTTP/1.0 403 Forbidden{ "message": "您无权访问该资源", "team": { "id": "abxT8sioa0Ms", "name": "CoDesign****" }}
La transmission de données en transportant le contexte facilite la combinaison libre des étudiants front-end.
Démarrer la transformationBien sûr, ce n'est pas une question compliquée, il suffit de modifier l'original
pour le résoudre :
- abort_if(!$user->isMember($resouce->team), 403, '您无权访问该资源'); + if (!$user->isMember($resouce->team)) { + return response()->json([ + 'message' => '您无权访问该资源', + 'team' => [ + 'id' => $resouce->team_id, + 'name'=> $resouce->team->desensitised_name, + ] + ], 403); + }
abort_if
Cela semble résoudre le problème, mais imaginez, si une exception est détectée dans la fermeture et que vous souhaitez quitter, le style d'écriture ci-dessus sera plus difficile après tout, ne fera que se terminer. . Dans le contexte récent, nous espérons toujours mettre fin à l'exécution de l'ensemble de l'application comme return
puis effectuer une autre transformation. return
abort
Implémentation optimisée de Après avoir regardé le code source
, j'ai découvert que son premier paramètre prend en charge les instances, et ce qui précède Le résultat de notre abort
est son instance, il nous suffit donc de le changer comme ceci : SymfonyComponentHttpFoundationResponse
if (!$user->isMember($resouce->team)) { abort(response()->json([ 'message' => '您无权访问该资源', 'team' => [ 'id' => $resouce->team_id, 'name'=> $resouce->team->desensitised_name, ] ], 403)); }
return
semble avoir implémenté des interruptions anormales, mais un nouveau problème est survenu si nécessaire. réutilisé, c'est embarrassant. Ce code apparaîtra à plusieurs reprises dans divers endroits où cette autorisation est jugée. Ce n'est pas ce que nous voulons.
Réutilisation logiqueAfin de réaliser la réutilisation logique, j'ai examiné l'implémentation de
et j'ai découvert que la méthode de la classe parent a également cette conception : AppExceptionsHandler
public function render($request, Throwable $e) { if (method_exists($e, 'render') && $response = $e->render($request)) { return Router::toResponse($request, $response); } elseif ($e instanceof Responsable) { return $e->toResponse($request); } //...
render
Nous pouvons donc extraire cette logique dans une classe d'exception indépendante et implémenter la méthode : render
Nous créons d'abord une classe d'exception :
$ ./artisan make:exception NotTeamMemberException
L'implémentation Le code est le suivant :
<?php namespace App\Exceptions; use App\Team; class NotTeamMemberException extends \Exception { public Team $team; public function __construct(Team $team, $message = "") { $this->team = $team; parent::__construct($message, 403); } public function render() { return response()->json( [ 'message' => !empty($this->message) ? $this->message : '您无权访问该资源', 'team' => [ 'id' => $this->team->id, 'name' => $this->team->desensitised_name, ], ], 403 ); } }
De cette façon, notre logique devient :
if (!$user->isMember($resouce->team)) { throw new NotTeamMemberException($resouce->team, '您无权访问该资源'); }
Bien sûr, il peut aussi être abrégé en :
\throw_if(!$user->isMember($resouce->team), NotTeamMemberException::class, $resouce->team, '您无权访问该资源');
Le problème est finalement résolu avec une comparaison La solution parfaite. Si vous avez une meilleure solution, veuillez laisser un commentaire.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!