Maison >cadre php >Laravel >Modèle d'analyse du code source Laravel (code)

Modèle d'analyse du code source Laravel (code)

不言
不言avant
2018-09-30 15:35:224446parcourir

Le contenu de cet article concerne le modèle (code) d'analyse du code source de Laravel. Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer.

Avant-propos

Je souhaite par avance aux singes une bonne fête nationale. Mangez bien, buvez bien et amusez-vous.

Selon le principe de développement à responsabilité unique, pendant le processus de développement de Laravel, chaque table doit établir un modèle pour les services et les appels externes. Semblable à ceci

namespace App\Models;
    
use Illuminate\Database\Eloquent\Model;
    
class User extends Model
{
    protected $table = 'users';
}

Analyse

Les opérations de données de Laravel sont divisées en deux types

  • Façade DB

  • ORM éloquent

En plus de leurs propres caractéristiques, les opérations de données de base sont effectuées via IlluminateDatabaseQueryBuilder méthodes d'appel pour compléter l'intégralité du SQL. Vous pouvez également utiliser la classe Builder comme classe de base pour l'ensemble de l'opération SQL. Ce cours couvre les méthodes de fonctionnement suivantes (affichage partiel)

方法
public function select($columns = ['*'])
public function selectSub($query, $as)
public function selectRaw($expression, array $bindings = [])
public function fromSub($query, $as)
public function fromRaw($expression, $bindings = [])
public function addSelect($column)
public function distinct()
public function from($table)
public function join($table, $first, $operator = null, $second = null, $type = 'inner', $where = false)
public function joinWhere($table, $first, $operator, $second, $type = 'inner')
public function joinSub($query, $as, $first, $operator = null, $second = null, $type = 'inner', $where = false)
public function leftJoin($table, $first, $operator = null, $second = null)
public function where($column, $operator = null, $value = null, $boolean = 'and')
public function orWhere($column, $operator = null, $value = null)
 public function whereRaw($sql, $bindings = [], $boolean = 'and')
public function whereIn($column, $values, $boolean = 'and', $not = false)
public function orWhereIn($column, $values)

On peut voir qu'il existe de nombreuses méthodes qui ne sont pas reflétées sur le site Web chinois de Laravel ou dans les documents officiels, donc même si vous voulez être compétent dans un framework, ne le lisez pas. Le code source ne fonctionne pas non plus. Ce fichier se trouve sous supplier/laravel/framework/src/Illuminate/Database/Query dans le répertoire de votre projet. Vous pouvez le vérifier vous-même.

Façade DB

Normalement, vous pouvez écrire une opération comme celle-ci

DB::table('user')->get();

Cette opération pointe d'abord vers le fichier via la façade de Laravel, mais elle n'est pas dans app.php , mais est chargé directement via le noyau, il est enregistré dans

Illuminate\Foundation\Application -> registerCoreContainerAliases()

. La façade appelle directement la classe IlluminateDatabaseDatabaseManager.

public function registerCoreContainerAliases()
{
        foreach ([
            ...
            'encrypter'            => [\Illuminate\Encryption\Encrypter::class, \Illuminate\Contracts\Encryption\Encrypter::class],
            'db'                   => [\Illuminate\Database\DatabaseManager::class],
            'db.connection'        => [\Illuminate\Database\Connection::class, \Illuminate\Database\ConnectionInterface::class],
            'events'               => [\Illuminate\Events\Dispatcher::class, \Illuminate\Contracts\Events\Dispatcher::class],
            'files'                => [\Illuminate\Filesystem\Filesystem::class],
            ....
        )
}

IlluminateDatabaseDatabaseManager Il ne contient pas beaucoup de code, la plupart gère les liens de base de données. Lorsque vous utilisez DB::table(), il sera transmis via

public function __call($method, $parameters)
{
    return $this->connection()->$method(...$parameters);
}

Ce qu'on appelle IlluminateDatabaseConnection. L'utilisateur traite la méthode table(), puis pointe vers la classe IlluminateDatabaseQuery via la table. (). Parlons-en au début. Après avoir passé cette catégorie, je n'entrerai pas dans les détails ici. Ensuite, il y a l'épissage de divers sql->exécuter sql->terminer la bataille

Modèle danalyse du code source Laravel (code)

Eloquent ORM

Eloquent ORM est similaire à la façade DB Tout d'abord, chaque Eloquent ORM doit hériter de la classe parent IlluminateDatabaseEloquentModel

Vous le ferez. écrivez probablement comme ça

User::find(1)
Cette méthode n'existe pas dans la classe parent Oui, elle transmettra l'appel de demande via

public static function __callStatic($method, $parameters)
{
    return (new static)->$method(...$parameters);
}
. De la même manière,

User::get()
est appelé via

public function __call($method, $parameters)
{
    if (in_array($method, ['increment', 'decrement'])) {
        return $this->$method(...$parameters);
    }
        
    return $this->newQuery()->$method(...$parameters);
}
Cette méthode se termine finalement par

new Builder()

Enfin on arrive au. Fichier IlluminateDatabaseEloquentBuilder Ci-dessous, cette classe couvre les opérations de base d'ORM, telles que find, findOrFail, etc. Si vous utilisez la méthode get dans votre code, désolé, pas ici, elle transmettra toujours votre demande à la classe IlluminateDatabaseQueryBuilder via la méthode __call
public function newEloquentBuilder($query)
{
    return new Builder($query);
}

Cela termine toute l'opération sur les données.
$this->query->{$method}(...$parameters);

Modèle danalyse du code source Laravel (code)

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