ホームページ  >  記事  >  PHPフレームワーク  >  Laravelソースコード解析モデル(コード)

Laravelソースコード解析モデル(コード)

不言
不言転載
2018-09-30 15:35:224409ブラウズ

この記事の内容は、Laravel のソースコード解析のモデル (コード) に関するものです。必要な方は参考にしていただければ幸いです。

序文

類人猿たちに、よく食べて、よく飲んで、よく遊んでください。

単一責任開発原則に従って、laravel の開発プロセス中に、各テーブルで外部サービスと呼び出しのモデルを確立する必要があります。これと同様に

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

Parsing

Laravelのデータ操作は2種類に分けられます

  • DBファサード

  • # Eloquent ORM

独自の特性に加えて、基本的なデータ操作は Illuminate\Database\Query\Builder メソッドを呼び出して SQL 全体を完了することによって完了します。 Builder クラスを SQL 操作全体の基本クラスとして使用することもできます。このクラスは以下の操作メソッドをカバーします(一部のみ表示)

# 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' ) # パブリック関数 whereIn($column, $values, $boolean = 'and', $not = false) public function orWhereIn($column, $values) 中国のlaravel Webサイトまたは公式ドキュメントに反映されていないため、フレームワークに習熟したくても、そのソースコードを見なければそれはできません。このファイルはプロジェクトディレクトリのvendor/laravel/framework/src/Illuminate/Database/Queryにあります。自分で確認できます。
method
public function select($columns = ['*'])
パブリック関数 selectSub($query, $as)
パブリック関数 selectRaw($expression, array $bindings = [])
パブリック関数 fromSub($query, $as)
パブリック関数 fromRaw($expression, $bindings = [])
## パブリック関数 addSelect ($column)
public function unique()
public function from ($ table)
public function join($table, $first, $operator = null, $second = null, $type = 'inner', $ where = false)
パブリック関数 joinWhere($table, $first, $operator, $second, $type = 'inner')
パブリック関数 joinSub($query, $as, $first, $operator = null, $second = null, $type = 'inner', $where = false)
DB ファサード

通常は次のような操作を記述できます

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

この操作は最初にlaravelのファサードを通じてファイルを指しますが、代わりにapp.phpにはありません。 、カーネルを通じて直接ロードされ、

Illuminate\Foundation\Application -> registerCoreContainerAliases()
に登録されます。ファサードは、Illuminate\Database\DatabaseManager クラスを直接呼び出します。

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],
            ....
        )
}
Illuminate\Database\DatabaseManager これには多くのコードはなく、ほとんどがデータベース接続を処理します。 DB::table() を使用すると、

public function __call($method, $parameters)
{
    return $this->connection()->$method(...$parameters);
}
を介して転送され、呼び出しは Illuminate\Database\Connection であり、ユーザーは table() メソッドを処理してから、Illuminate\Database\ を介して Illuminate\Database\ をポイントします。 table() メソッド Query クラスについては、最初に説明したのでここでは詳しく説明しません。次に、さまざまな SQL の結合 -> SQL の実行 -> 戦闘の終了

##Eloquent ORMLaravelソースコード解析モデル(コード)Eloquent ORM は DB ファサードに似ています。まず、各 Eloquent ORM は親クラス Illuminate\Database\Eloquent\ を継承する必要があります。モデル

おそらく次のように書くでしょう

User::find(1)

このメソッドは親クラスに存在しません。

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

を通じてリクエスト呼び出しを転送します。同様に、
User::get()

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

を通じて呼び出され、最終的に

new Builder()

に到達します。 \Database\Eloquent\Builder ファイルを照らすこのクラスは、検索、findOrFail などの ORM の基本操作をカバーします。コード内で get メソッドを使用した場合、申し訳ありませんが、__call メソッドを介して Illuminate\Database\Query\Builder クラスにリクエストが転送されます

public function newEloquentBuilder($query)
{
    return new Builder($query);
}

データ操作全体が完了します。

以上がLaravelソースコード解析モデル(コード)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はsegmentfault.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。