Dans le développement de PHP, en particulier lorsque nous utilisons des cadres comme Laravel, nous faisons souvent des jugements de type sur les objets de demande entrants dans les contrôleurs ou le middleware. Ce scénario est particulièrement courant lorsque une logique différente est nécessaire pour s'exécuter sur certains types de demandes, telles que les demandes d'API ou les classes de demande personnalisées. Cet article présentera comment utiliser la fonction is_a () pour déterminer le type d'objet demandé et les avantages de cette méthode.
Supposons que nous ayons un middleware qui doit décider de continuer à exécuter la logique ultérieure en fonction de la question de savoir si la demande est une classe de demande personnalisée spécifique. Par exemple, nous pouvons créer une demande de demande personnalisée App \ http \ requêtes \ apirequest pour les demandes d'API qui héritent d'illuminer \ http \ requêtes . Dans ce cas, nous devons faire la distinction entre les demandes normales et les demandes d'API dans le middleware.
PHP fournit une variété de façons de juger les types d'objets, y compris l'opérateur d'instance OFF et la fonction is_a () . Bien que les deux fonctions soient similaires, IS_A () fournit une méthode d'appel de fonction plus flexible, particulièrement adaptée aux scénarios de jugement de type dynamique.
La syntaxe est la suivante:
is_a(object|string $object_or_class, string $class, bool $allow_string = false): bool
Lorsque $ allow_string est défini sur true , vous pouvez passer dans la chaîne de nom de classe au lieu de l'objet.
Voici un exemple simple du middleware. Nous utilisons IS_A () pour déterminer si la demande est de type apirequest :
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use App\Http\Requests\ApiRequest;
class CheckApiRequest
{
public function handle(Request $request, Closure $next)
{
if (is_a($request, ApiRequest::class)) {
// contre API Demande la logique d'exécution
// Par exemple, journalisation、Ajoutez des informations de l'en-tête spéciales, etc.
}
return $next($request);
}
}
Dans le code ci-dessus, si l'objet de demande entrant est une instance de la classe Apirequest , une logique spécifique peut être exécutée. Sinon, il sera transmis directement au prochain middleware ou contrôleur.
La même logique s'applique au contrôleur. Par exemple, dans une méthode de contrôleur:
public function store(Request $request)
{
if (is_a($request, \App\Http\Requests\ApiRequest::class)) {
// traiter avec API La logique de la demande
return response()->json(['message' => 'C'est API demander']);
}
// 普通demander逻辑
return view('form-submitted');
}
Cela permet une implémentation facile du traitement différencié de différents types de demandes par la même méthode de contrôleur.
Parfois, nous pouvons obtenir dynamiquement des noms de classe dans des fichiers de configuration ou d'autres sources, et les avantages de IS_A () sont reflétés. Les exemples sont les suivants:
$className = 'App\Http\Requests\ApiRequest';
if (is_a($request, $className)) {
// 逻辑traiter avec
}
Ceci est très pratique lors de la mise en œuvre de systèmes de plug-in ou d'architectures modulaires.
L'utilisation d'Is_A () pour déterminer le type de l'objet de demande est une approche claire, flexible et très lisible, en particulier dans les middleware et les contrôleurs qui nécessitent des réponses différentes au type de demande. Par rapport à l'instance OFF , IS_A () est plus adapté aux scénarios dynamiques et a également les mêmes performances et précision.
En utilisant cette approche rationnellement, vous pouvez rendre votre application plus modulaire et claire lors de la gestion de la logique de demande complexe. Si vous souhaitez pratiquer davantage cette méthode, vous pouvez vous référer au lien suivant pour plus d'exemples de code: