Heim  >  Artikel  >  PHP-Framework  >  Laravel-Quellcode-Analysemodell (Code)

Laravel-Quellcode-Analysemodell (Code)

不言
不言nach vorne
2018-09-30 15:35:224409Durchsuche

Der Inhalt dieses Artikels befasst sich mit dem Modell (Code) der Laravel-Quellcode-Analyse. Ich hoffe, dass er für Sie hilfreich ist.

Vorwort

Ich wünsche den Affen im Voraus einen schönen Nationalfeiertag. Essen Sie gut, trinken Sie gut und haben Sie Spaß.

Gemäß dem Single-Responsibility-Entwicklungsprinzip sollte während des Entwicklungsprozesses von Laravel jede Tabelle ein Modell für externe Dienste und Anrufe erstellen. Ähnlich

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

Parsing

Laravels Datenoperationen sind in zwei Typen unterteilt

  • DB-Fassade

  • Eloquentes ORM

Zusätzlich zu ihren eigenen Eigenschaften werden grundlegende Datenoperationen durch IlluminateDatabaseQueryBuilder Aufrufmethoden abgeschlossen, um das gesamte SQL zu vervollständigen. Sie können die Builder-Klasse auch als Basisklasse für die gesamte SQL-Operation verwenden. Dieser Kurs behandelt die folgenden Betriebsmethoden (teilweise Anzeige)

方法
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)

Es ist ersichtlich, dass es viele Methoden gibt, die nicht auf der chinesischen Laravel-Website oder in offiziellen Dokumenten widergespiegelt sind, also selbst wenn Sie kompetent sein möchten In einem Framework lesen Sie es nicht. Der Quellcode funktioniert auch nicht. Diese Datei befindet sich unter „vendor/laravel/framework/src/Illuminate/Database/Query“ in Ihrem Projektverzeichnis. Sie können sie selbst überprüfen.

DB-Fassade

Normalerweise schreiben Sie eine Operation wie diese

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

Diese Operation verweist zunächst über die Fassade von Laravel auf die Datei, sie befindet sich jedoch nicht in app.php , es wird direkt über den Kernel geladen und in

Illuminate\Foundation\Application -> registerCoreContainerAliases()

registriert. Die Fassade ruft direkt die IlluminateDatabaseDatabaseManager-Klasse auf.

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 Es ist nicht viel Code darin, der größte Teil davon kümmert sich um Datenbankverbindungen. Wenn Sie DB::table() verwenden, wird es über

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

weitergeleitet. Der Benutzer verarbeitet die table()-Methode und zeigt dann über table() auf die IlluminateDatabaseQuery-Klasse. Methode. Wir haben am Anfang darüber gesprochen, ich werde hier nicht auf Details eingehen, und dann ist da noch das Zusammenfügen verschiedener SQL->Execute SQL->End the Battle

Laravel-Quellcode-Analysemodell (Code)

Eloquent ORM

Eloquent ORM ähnelt der DB-Fassade. Zuerst muss jedes Eloquent ORM die übergeordnete Klasse IlluminateDatabaseEloquentModel erben
Sie werden wahrscheinlich so schreiben

User::find(1)

Diese Methode ist in der übergeordneten Klasse nicht vorhanden, sie wird

public static function __callStatic($method, $parameters)
{
    return (new static)->$method(...$parameters);
}

verwenden, um den Anforderungsaufruf weiterzuleiten. Auf die gleiche Weise wird

User::get()

über

public function __call($method, $parameters)
{
    if (in_array($method, ['increment', 'decrement'])) {
        return $this->$method(...$parameters);
    }
        
    return $this->newQuery()->$method(...$parameters);
}

aufgerufen. Schließlich gelangen wir zur IlluminateDatabaseEloquentBuilder-Datei Verstehen Sie die grundlegenden Operationen von ORM, z. B. find, findOrFail usw. Wenn Sie die get-Methode in Ihrem Code verwenden, leider nicht hier, wird Ihre Anfrage trotzdem über die __call-Methode an die IlluminateDatabaseQueryBuilder-Klasse weitergeleitet. new Builder()

public function newEloquentBuilder($query)
{
    return new Builder($query);
}
Damit ist der gesamte Datenvorgang abgeschlossen.

Das obige ist der detaillierte Inhalt vonLaravel-Quellcode-Analysemodell (Code). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:segmentfault.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen