Rumah  >  Artikel  >  rangka kerja php  >  Mengapa laravel menggunakan fasad?

Mengapa laravel menggunakan fasad?

WBOY
WBOYasal
2022-06-06 16:02:102084semak imbas

Dalam laravel, kerana fasad boleh menyediakan antara muka "statik" untuk bekas perkhidmatan aplikasi, berbanding kaedah statik tradisional, antara muka "statik" yang disediakan oleh fasad adalah bersamaan dengan antara muka statik dalam kelas asas daripada bekas perkhidmatan. Melambangkan bahawa ia boleh menyediakan sintaks yang lebih fleksibel dan lebih mudah untuk diuji, jadi fasad digunakan dalam laravel.

Mengapa laravel menggunakan fasad?

Persekitaran pengendalian artikel ini: sistem Windows 10, Laravel versi 6, komputer Dell G3.

Mengapa laravel menggunakan fasad

Fasad dalam Laravel secara amnya mengikut idea asas corak fasad. Fasad dalam Laravel menyediakan antara muka [statik] untuk bekas perkhidmatan aplikasi, yang setara dengan [wakil statik] dalam kelas asas bekas perkhidmatan, yang boleh memberikan sintaks yang lebih fleksibel, mudah diuji dan elegan.

Untuk fasad di Laravel, kami akan sering menggunakannya, seperti caching.

Cache::get('key');

Contoh lain ialah pangkalan data dan Redis yang sering kita gunakan sebelum ini.

DB::connection('mysql2')->table('db_test')->get()->toArray();
 
Redis::connection('default')->client()->get('test')

Saya dapati, fasad semuanya kaedah statik. Tetapi jika anda mengklik padanya, anda akan mendapati bahawa tiada apa-apa dalam kategori fasad ini!

class Cache extends Facade
{
    protected static function getFacadeAccessor()
    {
        return 'cache';
    }
}

Dalam kelas Fasad, kita tidak perlu melihat fungsi kaedah lain buat masa ini. Hanya tatal ke bawah dan anda akan menemui kaedah ajaib, __callStatic().

public static function __callStatic($method, $args)
{
    $instance = static::getFacadeRoot();
 
    if (! $instance) {
        throw new RuntimeException('A facade root has not been set.');
    }
 
    return $instance->$method(...$args);
}

__callStatic() bermakna jika tiada kaedah yang sepadan ditakrifkan semasa memanggil secara statik, ia akan memasuki kaedah __callStatic() Contohnya, kaedah Cache::get() yang kami panggil, sebenarnya Tidak juga kelas fasad Cache semasa mahupun kelas induknya Facade mentakrifkan kaedah ini, jadi ia pergi terus ke __callStatic(). Kemudian, ia mendapat objek contoh fasad semasa kami melalui getFacadeRoot(), dan kemudian memanggil kaedah get() dalam objek contoh.

Baiklah, itu sahaja, jika penemuduga bertanya kepada anda semasa temu duga cara melaksanakan mod fasad dalam Laravel, anda boleh dengan yakin mengatakan bahawa intinya ialah kaedah ajaib __callStatic(). Jadi dari manakah objek contoh khusus ini berasal? Mari kita teruskan melihat ke bawah.

Objek tikar

Seterusnya mari kita lihat bagaimana objek tika tertentu dalam Fasad diperolehi. Di sini kita perlu kembali ke bekas perkhidmatan. Tetapi mari kita lihat di pintu masuk dahulu.

Dalam kaedah __callStatic() , kita akan melihat bahawa kaedah statik::getFacadeRoot() dipanggil untuk mendapatkan objek contoh tertentu.

public static function getFacadeRoot()
{
    return static::resolveFacadeInstance(static::getFacadeAccessor());
}

Kandungan kaedah ini sangat mudah, ia hanya memanggil dua kaedah lain Ambil perhatian bahawa getFacadeAccessor() dilaksanakan dalam setiap subkelas fasad kami, contohnya, ia dilaksanakan dalam kelas Cache. Ia hanya mengembalikan alias untuk contoh. Ingat di mana alias ini ditakrifkan? Kami telah melihatnya dalam bekas perkhidmatan, iaitu yang ditakrifkan dalam kaedah registerCoreContainerAliases() dalam vendor/laravel/framework/src/Illuminate/Foundation/Application.php.

Seterusnya, perkara utama yang kita lihat ialah kaedah statik::resolveFacadeInstance(). Kita boleh tahu daripada nama bahawa ia bermaksud untuk menyelesaikan contoh fasad Jika perkara ini tidak mengembalikan objek contoh, ia benar-benar tidak sesuai dengan namanya.

protected static function resolveFacadeInstance($name)
{
    if (is_object($name)) {
        return $name;
    }
 
    if (isset(static::$resolvedInstance[$name])) {
        return static::$resolvedInstance[$name];
    }
 
    if (static::$app) {
        return static::$resolvedInstance[$name] = static::$app[$name];
    }
}

Penghakiman pertama ialah jika objek dimasukkan, ia akan dikembalikan terus. Penghakiman kedua ialah jika sudah ada satu dalam tatasusunan contoh semasa, ia tidak akan dibuat lagi, yang serupa dengan kesan mod flyweight. Nota, susunan ahli statik! Apakah maksudnya? Statik dan dikongsi secara global, iaitu, selepas objek contoh anda dibuat, ia boleh digunakan di tempat lain, dalam keadaan tunggal yang lengkap. Pertimbangan terakhir ialah jika apl, iaitu, bekas perkhidmatan kami wujud, melaksanakan pengendalian bekas perkhidmatan.

Mari kita lihat dahulu apabila atribut apl diberikan nilai. Apabila bercakap tentang pembekal perkhidmatan, terdapat tatasusunan atribut bootstrappers dalam Kernel, yang mempunyai pembekal RegisterFacades. Jelas sekali, ia adalah penyedia perkhidmatan yang digunakan untuk mendaftarkan fasad Dalam penyedia perkhidmatan ini, kita akan melihat kod seperti ini.

public function bootstrap(Application $app)
{
    Facade::clearResolvedInstances();
 
    Facade::setFacadeApplication($app);
 
    AliasLoader::getInstance(array_merge(
        $app->make('config')->get('app.aliases', []),
        $app->make(PackageManifest::class)->aliases()
    ))->register();
}

Antaranya, Facade::setFacadeApplication() menyuntik objek Aplikasi bekas perkhidmatan ke dalam aplikasi pembolehubah ahli statik kelas fasad. Ambil perhatian bahawa ia juga statik dan wujud secara global.

Kemudian kita teruskan kembali ke kaedah resolveFacadeInstance().

protected static function resolveFacadeInstance($name)
{
    // …………
    // …………
    if (static::$app) {
        return static::$resolvedInstance[$name] = static::$app[$name];
    }
}

Apa yang berlaku di sini? Bagaimanakah saya boleh mendapatkan objek contoh melalui statik::$app[$name]? Jangan teruja, jangan risau, fikirkan bagaimana untuk membuat objek melakukan operasi tatasusunan sedemikian? Kami mempelajarinya sebelum ini!

Ini ialah antara muka ArrayAccess Kaedah yang mesti dilaksanakan membolehkan objek digunakan seperti tatasusunan.

OK, sekarang setelah kita tahu prinsipnya, mari lihat sama ada ini berlaku dan cari kelas induk vendor Aplikasi/laravel/framework/src/Illuminate/Container/Container.php .

class Container implements ArrayAccess, ContainerContract
{
    // …………
    // …………
    public function offsetGet($key)
    {
        return $this->make($key);
    }
    // …………
    // …………
}

Memang nampak macam Baymax kan? Tak perlu saya terangkan lagi kan? Kaedah make() telah dijelaskan dalam bekas perkhidmatan sebelumnya.

Baiklah, selebihnya terpulang kepada anda Sila cari kelas pelaksanaan khusus Cache berdasarkan alias dalam kaedah registerCoreContainerAliases() dalam vendor/laravel/framework/src/Illuminate/Foundation/Application.php, dan kemudian analisis. ia Pelaksanaan get(), set(), forget() dan kaedah lain, dan lihat cara mereka menggunakan penyelesaian storan cache yang berbeza mengikut fail konfigurasi kami.

[Cadangan berkaitan: tutorial video laravel]

Atas ialah kandungan terperinci Mengapa laravel menggunakan fasad?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn