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

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

不言
Libérer: 2018-09-30 15:35:21
avant
4444 Les gens l'ont consulté

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';
}
Copier après la connexion

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();
Copier après la connexion

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()
Copier après la connexion

. 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],
            ....
        )
}
Copier après la connexion

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);
}
Copier après la connexion

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)
Copier après la connexion
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);
}
Copier après la connexion
. De la même manière,

User::get()
Copier après la connexion
est appelé via

public function __call($method, $parameters)
{
    if (in_array($method, ['increment', 'decrement'])) {
        return $this->$method(...$parameters);
    }
        
    return $this->newQuery()->$method(...$parameters);
}
Copier après la connexion
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);
}
Copier après la connexion

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

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!

Étiquettes associées:
source:segmentfault.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal