recherche
Maisoncadre phpLaravelImplémentation d'une façade Laravel simple à l'aide des traits de fonctionnalités PHP

La colonne tutorielle suivante de Laravel vous présentera comment utiliser les traits PHP pour implémenter une façade simple. J'espère qu'elle sera utile à tout le monde !

Façade peut m'aider efficacement à mettre en œuvre la méthode des méthodes statiques. Laravel La plupart des packages d'extension utilisent Facade. [Recommandé : tutoriel vidéo Laravel]Le simple Façade suivant Il utilise les fonctionnalités de PHP trait, la méthode magique __callStatic et la classe de réflexion ReflectionClass.

Facade 可以有效帮我实现方法的静态化。Laravel 大部分的扩展包都使用了 Facade。【推荐:laravel视频教程
下面的简易 Facade 主要是利用 PHP 的特性 trait,魔术方法 __callStatic,反射类 ReflectionClass

使用场景

后台系统大部分都会有类似这样的操作:

<?php $user = User::find($id);if (!$user) {
    throw new \Expection("资源不存在");}

这样似乎没有什么问题,但是还会存在下面这样的:

$article = Article::find($id);if (!$article) {
    throw new \Expection("资源不存在");}$article->delete();

这样写法十分不优雅。

上代码

1、首先我们应该要有一个 Service

<?phpnamespace  App\Services;use App\Traits\ModeServiceTrait;class ModelService extends BaseService{
    use ModeServiceTrait;}

2、新建一个 Trait

trait 为了多继承而存在的,可以去 PHP官网 看文档。

<?php namespace App\Traits;
use \ReflectionClass;
use \Exception;use \ReflectionException;
use Illuminate\Database\Eloquent\Model;
use App\Exceptions\ResourceException;
/**
 * @method static Model find(string $className, int $id, callable $callback = null)
 *
 * @see Model
 * @package App\Services
 */trait ModeServiceTrait{
    /**
     * 回调方法
     *
     * @param Model|null $model
     * @param string $method
     * @return Model
     * @throws ResourceException
     */
    public static function callback(Model|null $model, string $method): Model    {
        switch ($method)
        {
            case &#39;first&#39;:
            case &#39;find&#39;:
                if (!$model) {
                    throw new ResourceException("资源不存在");
                }
                break;

            default:

                break;
        }

        return $model;
    }

    /**
     * 调用不存在的方法时触发
     *
     * @param $method
     * @param $args
     * @return false|mixed
     * @throws ReflectionException
     * @throws ResourceException
     * @throws Exception
     */
    public static function __callStatic($method, $args)
    {
        $className = $args[0];
        $arg = $args[1];

        // 判断模型类是否存在
        if (!class_exists($className)) {
            throw new Exception("The class {$className} could not be found. from:" . __CLASS__);
        }

        // 利用反射实例化其类
        $reflection = new ReflectionClass($className);
        $instance = $reflection->newInstanceArgs();

        // 调用该不存在的方法
        $model = call_user_func_array([$instance, $method], [$arg]);

        // 如果存在复杂操作交给 callback
        return isset($args[2]) ? $args[2]($model) : self::callback($model, $method);
    }}

首先我们关注 __callStatic 这个魔术方法。 当调用不存在的静态方法时会触发该方法。和他相似的魔术方法是 __call。这是使用 __callStatic 是为了达到 Facade 的效果。

__callStatic 有两个回调参数 $method被调用的且不存在的方法$args$method 方法中所传递的参数(数组形式)。

这样一个简易的 trait 就完成了。

使用

我们新建一个 command

$ php artisan make:command TestCommand

写入下面的内容

<?php namespace App\Console\Commands;
use Illuminate\Console\Command;
use App\Services\ModelService;
use App\Models\Article\Article;
class TestCommand extends Command{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = &#39;test:test&#39;;

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = &#39;a test&#39;;

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     */
    public function handle()
    {
        $article = ModelService::find(Article::class, 1);

        $article = ModelService::find(Article::class, 1, function ($model) {
            return $model->load('author');
        });
    }}

其中的 Article 模型需要自己去创建。
接下来就可以看看效果了:

$ php artisan test:test

结语

这样我们就抛弃了使用 abstract 抽象类,来达到了跟 Facade
Scénarios d'utilisation

La plupart des systèmes d'arrière-plan auront des opérations similaires à celle-ci : rrreee

Il ne semble y avoir aucun problème avec cela, mais il y aura également ce qui suit : 🎜rrreee🎜Cette façon d'écrire est très inélégante . 🎜🎜🎜🎜🎜Téléchargez le code🎜🎜🎜🎜🎜🎜1. Tout d'abord, nous devrions avoir un service🎜🎜rrreee🎜🎜🎜🎜2. Créez un nouveau trait🎜🎜🎜, vous pouvez accéder au PHP. site officiel pour voir le document. 🎜rrreee🎜Nous nous concentrons d'abord sur la méthode magique __callStatic. Cette méthode est déclenchée lorsqu'une méthode statique inexistante est appelée. Une méthode magique similaire est __call. Ceci utilise __callStatic pour obtenir l'effet de Facade. 🎜🎜__callStatic a deux paramètres de rappel $method qui est une méthode appelée qui n'existe pas, $args Il est le paramètre (sous forme de tableau) passé dans la méthode $method. 🎜🎜Un trait aussi simple est complet. 🎜🎜🎜🎜🎜Utilisation🎜🎜🎜Nous créons une nouvelle commande🎜rrreee🎜Écrivez le contenu suivant🎜rrreee🎜Le modèle Article doit être créé par vous-même. 🎜Maintenant, vous pouvez voir l'effet :🎜rrreee🎜🎜🎜🎜Conclusion🎜🎜🎜De cette façon, nous abandonnons l'utilisation de la classe abstraite abstract et obtenons le même effet que Façade effet. Dans le même temps, la réutilisation du code est également réalisée. 🎜Utiliser le programme de cette manière nécessitera beaucoup plus d'étapes, mais comparées à l'élégance, les performances n'ont pas d'importance. 🎜🎜L'expression n'est pas très claire, il faut la comprendre en profondeur. 🎜                                                                                                               

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!

Déclaration
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer
Outils de gestion des tâches: prioriser et suivre les progrès dans les projets distantsOutils de gestion des tâches: prioriser et suivre les progrès dans les projets distantsMay 02, 2025 am 12:25 AM

TaskManagementToolsAreEssentialforeFeCiveRemoteProjectManagementByprioriTizingTasksAndTrackingProgress.1) UsetoolslikeTrelloandasanatoSetPriorités withLabelsOrtags.2) EmployTools LikejiraandMonday.comForvisualTrackingwithGantTucsandProgressBars.3)

Comment la dernière version de Laravel améliore-t-elle les performances?Comment la dernière version de Laravel améliore-t-elle les performances?May 02, 2025 am 12:24 AM

Laravel10enhances performancethroughseveralkeyfeatures.1) introduducesquerybuildercachingtoredatabaseload.2) itoptimiseseloquentmodelloadingwithlazyloadingproxies.3) itimproveSroutingwithewcachingsystem.4) itenhance

Stratégies de déploiement pour les applications de laravel à complexe completStratégies de déploiement pour les applications de laravel à complexe completMay 02, 2025 am 12:22 AM

Les meilleures stratégies de déploiement d'applications Laravel complètes comprennent: 1. Un déploiement de temps d'arrêt zéro, 2. Déploiement du bleu-vert, 3. Déploiement continu et 4. Canary Release. 1. Le déploiement de temps d'arrêt zéro utilise l'envoyé ou le déploiement pour automatiser le processus de déploiement pour garantir que les applications restent disponibles lorsqu'elles sont mises à jour. 2. Le déploiement bleu et vert permet le déploiement des temps d'arrêt en maintenant deux environnements et permet un retour rapide. 3. Déploiement continu automatiser l'intégralité du processus de déploiement via GitHubactions ou GitLabci / CD. 4. Canary rejette via la configuration Nginx, promouvant progressivement la nouvelle version aux utilisateurs pour assurer l'optimisation des performances et le retrait rapide.

Échelle d'une application de Laravel complète: meilleures pratiques et techniquesÉchelle d'une application de Laravel complète: meilleures pratiques et techniquesMay 02, 2025 am 12:22 AM

Toscalealaravelapplication efficace, focaledatabasesharding, cache, chargeur et microservices.1) mettant en œuvre un databaseshardingtodistributedataacrossmultipledatabases pour la performance. 2)

La lutte silencieuse: surmonter les barrières de communication dans les équipes distribuéesLa lutte silencieuse: surmonter les barrières de communication dans les équipes distribuéesMay 02, 2025 am 12:20 AM

Toovercome Communication BarriersInSiStributedTeams, Utilisation: 1) VideoCallsforface-to-faceteraction, 2) setClearResponSetimeExpectations, 3) ChooseAppropriateCommunicationTools, 4) CreateAteamCommunicationGuide, and5)

Utilisation de Laravel Blade pour les modèles de frontend dans des projets de file d'attenteUtilisation de Laravel Blade pour les modèles de frontend dans des projets de file d'attenteMay 01, 2025 am 12:24 AM

LaravelbladeenhancesfronttendTemplatingInfull-stackprojectsByOffreringCleanSyntaxandpowerfulfetures.1)

Construire une application complète avec Laravel: un tutoriel pratiqueConstruire une application complète avec Laravel: un tutoriel pratiqueMay 01, 2025 am 12:23 AM

LaravelisidealForfull-stackApplicationsduetoitselegantsyntax, comprehensivecosystem, andpowerfulfeatures.1) useeloquentormforIntivebackendDatamanipulation, butavoidn 1queryissues.2) employbladetetemplatforcleanfrontwiews, étant acautes overusing @ i i i

Quel type d'outils avez-vous utilisé pour le rôle distant pour rester connecté?Quel type d'outils avez-vous utilisé pour le rôle distant pour rester connecté?May 01, 2025 am 12:21 AM

Forremotework, iusezoomforvideocalls, slackformessaging, trelloforprojectmanagement, andgithubforcodecollaboration.1) zoomisreliableforlaremeetingsbuthastimelitsonthefreeversion.2) slackintegratewelwithother

See all articles

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Outils chauds

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

VSCode Windows 64 bits Télécharger

VSCode Windows 64 bits Télécharger

Un éditeur IDE gratuit et puissant lancé par Microsoft

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

Dreamweaver Mac

Dreamweaver Mac

Outils de développement Web visuel

SublimeText3 Linux nouvelle version

SublimeText3 Linux nouvelle version

Dernière version de SublimeText3 Linux