Rumah  >  Artikel  >  rangka kerja php  >  Dapatkan contoh bekas dalam kod (Laravel)

Dapatkan contoh bekas dalam kod (Laravel)

藏色散人
藏色散人ke hadapan
2021-08-06 09:35:101861semak imbas

Artikel ini ditulis oleh ruangan tutorial laravel untuk memperkenalkan cara mendapatkan contoh bekas dalam kod saya harap ia dapat membantu rakan yang memerlukan!

Adegan bekas laravel adalah unik sepanjang kitaran hayat permintaan dan mengurus semua tika komponen perkhidmatan. Jadi apakah cara untuk mendapatkan contoh bekas laravel? Kaedah berikut biasanya digunakan:

1) Melalui fungsi bantuan aplikasi:

$app = app();

Fungsi tambahan aplikasi ditakrifkan dalam

Dapatkan contoh bekas dalam kod (Laravel)

Dalam fail, fail ini mentakrifkan banyak fungsi bantuan dan akan dimuatkan secara automatik ke dalam projek melalui komposer. Oleh itu, fungsi boleh diakses di mana-mana lokasi kod yang terlibat dalam pemprosesan permintaan http, seperti app().

2) Melalui App Facade

<?php
Route::get(&#39;/&#39;, function () {
    dd(App::basePath());
    return &#39;&#39;;
});

Cara untuk mendapatkan contoh kontena melalui App Facade adalah berbeza daripada di atas Anda tidak boleh menetapkan Apl kepada pembolehubah dahulu dan kemudian gunakan pembolehubah. Ini kerana App hanyalah nama kelas, dan kami tidak boleh menyalin nama kelas ke dalam pembolehubah. $app = App; bukan pernyataan boleh laku yang sah, tetapi $app = app(); ialah pernyataan boleh laku yang sah, kerana terdapat app() selepasnya, menunjukkan panggilan fungsi. App::basePath(); juga merupakan pernyataan undang-undang, ia memanggil kaedah statik kelas.

Tambah 2 mata lagi:

Titik pertama: Fasad ialah ciri khas dalam rangka kerja laravel Setiap Fasad akan dikaitkan dengan objek contoh dalam bekas Panggilan kaedah statik kelas digunakan untuk menggunakan kaedah pada objek contoh yang berkaitan. Contohnya, Facade of App, apabila memanggil App::basePath(), sebenarnya bersamaan dengan app()->basePath().

Mekanisme asas ini juga bergantung pada ciri-ciri bahasa PHP Ia perlu menetapkan ahli statik dalam setiap Fasad dan mengaitkannya dengan objek contoh perkhidmatan apabila memanggil kaedah statik kelas Fasad. huraikan nama kaedah yang dipanggil, kemudian panggil kaedah dengan nama yang sama bagi contoh perkhidmatan yang berkaitan, dan akhirnya kembalikan hasilnya.

Saya rasa sudah cukup untuk memahami peranan yang boleh dimainkan oleh Facade. Ia tidak perlu untuk menyelidiki lapisan bawahnya untuk memahami butiran pelaksanaan Lagipun, dalam pembangunan sebenar, Facade tidak digunakan dan tidak menjejaskan penggunaan rangka kerja Laravel sama sekali. Selain itu, dalam pengekodan sebenar, sangat mudah untuk menyesuaikan Facade Hanya mewarisi kelas asas Fasad yang dikapsulkan oleh laravel:

<?php
namespace ThirdProviders\CasServer\Facades;
use Illuminate\Support\Facades\Facade;
use ThirdProviders\CasServer\CasServerManager;
class CasServer extends Facade
{
    protected static function getFacadeAccessor()
    {
        return CasServerManager::class;
    }
}

Laksanakan kaedah getFacadeAccessor kelas asas Fasad, dan rangka kerja laravel akan tahu kelas Fasad ini yang mana contoh perkhidmatan harus dikaitkan dengannya. Sebenarnya, nama yang dikembalikan oleh kaedah getFacadeAccess ini ialah nama mengikat perkhidmatan yang akan diperkenalkan kemudian. Dalam bekas laravel, contoh perkhidmatan akan mempunyai nama pengikatan tetap, dan tika itu boleh ditemui melalui nama ini. Jadi mengapa kelas Fasad hanya perlu mengembalikan nama pengikat perkhidmatan.

Kita boleh melihat kod kelas App Facade:

<?php
namespace Illuminate\Support\Facades;
/**
 * @see \Illuminate\Foundation\Application
 */
class App extends Facade
{
    /**
     * Get the registered name of the component.
     *
     * @return string
     */
    protected static function getFacadeAccessor()
    {
        return &#39;app&#39;;
    }
}

GetFacadeAccessornya mengembalikan rentetan "apl", yang digunakan oleh bekas laravel untuk mengikat dirinya.

Perkara kedua: Daripada kod sumber App Facade pada titik sebelumnya, kita dapat melihat bahawa nama kelas penuh App Facade sebenarnya ialah: IlluminateSupportFacadesApp, jadi mengapa kita boleh terus menggunakan nama pendek App dalam kod tersebut? Ia boleh diakses:

<?php
Route::get(&#39;/&#39;, function () {
    dd(App::basePath());
    return &#39;&#39;;
});

Anda melihat bahawa kod di atas tidak menggunakan cara guna atau layak sepenuhnya untuk menggunakan IlluminateSupportFacadesApp. Sebenarnya, App adalah sama sepenuhnya dengan IlluminateSupportFacadesApp, kecuali App adalah jauh lebih pendek daripada IlluminateSupportFacadesApp dan tidak memerlukan penggunaan, jadi bagaimana ia dilaksanakan? Ini berkaitan dengan alias yang dikonfigurasikan dalam bekas laravel Dalam config/app.php,

mempunyai bahagian alias khusus untuk mengkonfigurasi beberapa jenis alias:

&#39;aliases&#39; => [
    &#39;App&#39; => Illuminate\Support\Facades\App::class,
    &#39;Artisan&#39; => Illuminate\Support\Facades\Artisan::class,
    &#39;Auth&#39; => Illuminate\Support\Facades\Auth::class,
    &#39;Blade&#39; => Illuminate\Support\Facades\Blade::class,
    &#39;Bus&#39; => Illuminate\Support\Facades\Bus::class,
    &#39;Cache&#39; => Illuminate\Support\Facades\Cache::class,
    &#39;Config&#39; => Illuminate\Support\Facades\Config::class,
    &#39;Cookie&#39; => Illuminate\Support\Facades\Cookie::class,
    &#39;Crypt&#39; => Illuminate\Support\Facades\Crypt::class,
    &#39;DB&#39; => Illuminate\Support\Facades\DB::class,
    &#39;Eloquent&#39; => Illuminate\Database\Eloquent\Model::class,
    &#39;Event&#39; => Illuminate\Support\Facades\Event::class,
    &#39;File&#39; => Illuminate\Support\Facades\File::class,
    &#39;Gate&#39; => Illuminate\Support\Facades\Gate::class,
    &#39;Hash&#39; => Illuminate\Support\Facades\Hash::class,
    &#39;Lang&#39; => Illuminate\Support\Facades\Lang::class,
    &#39;Log&#39; => Illuminate\Support\Facades\Log::class,
    &#39;Mail&#39; => Illuminate\Support\Facades\Mail::class,
    &#39;Notification&#39; => Illuminate\Support\Facades\Notification::class,
    &#39;Password&#39; => Illuminate\Support\Facades\Password::class,
    &#39;Queue&#39; => Illuminate\Support\Facades\Queue::class,
    &#39;Redirect&#39; => Illuminate\Support\Facades\Redirect::class,
    &#39;Redis&#39; => Illuminate\Support\Facades\Redis::class,
    &#39;Request&#39; => Illuminate\Support\Facades\Request::class,
    &#39;Response&#39; => Illuminate\Support\Facades\Response::class,
    &#39;Route&#39; => Illuminate\Support\Facades\Route::class,
    &#39;Schema&#39; => Illuminate\Support\Facades\Schema::class,
    &#39;Session&#39; => Illuminate\Support\Facades\Session::class,
    &#39;Storage&#39; => Illuminate\Support\Facades\Storage::class,
    &#39;URL&#39; => Illuminate\Support\Facades\URL::class,
    &#39;Validator&#39; => Illuminate\Support\Facades\Validator::class,
    &#39;View&#39; => Illuminate\Support\Facades\View::class
],

dan kemudian dalam. rangka kerja laravel Semasa proses memproses permintaan, alias ini akan didaftarkan dalam persekitaran global melalui kelas IlluminateFoundationBootstrapRegisterFacades:

<?php
namespace Illuminate\Foundation\Bootstrap;
use Illuminate\Support\Facades\Facade;
use Illuminate\Foundation\AliasLoader;
use Illuminate\Contracts\Foundation\Application;
class RegisterFacades
{
    /**
     * Bootstrap the given application.
     *
     * @param  \Illuminate\Contracts\Foundation\Application  $app
     * @return void
     */
    public function bootstrap(Application $app)
    {
        Facade::clearResolvedInstances();
        Facade::setFacadeApplication($app);
        AliasLoader::getInstance($app->make(&#39;config&#39;)->get(&#39;app.aliases&#39;, []))->register();
    }
}

Jadi kita boleh terus menggunakan alias dan bukannya nama jenis lengkap untuk melakukan perkara yang sama fungsi capaian. Jika anda telah menulis sendiri beberapa kelas dengan nama yang sangat panjang dan banyak digunakan dalam kod, anda juga boleh mempertimbangkan untuk mengkonfigurasinya dalam alias config/app.php, dan laravel akan mendaftarkannya untuk kami.

3) Cara lain untuk mendapatkan contoh bekas laravel ialah menggunakan aplikasi $this-> terus dalam pembekal perkhidmatan

Pembekal perkhidmatan akan diperkenalkan kemudian, tetapi ia baru diperkenalkan sekarang. Oleh kerana kelas penyedia perkhidmatan diinstantiate oleh bekas laravel, kelas ini mewarisi daripada IlluminateSupportServiceProvider, yang mentakrifkan atribut instance $app

Dapatkan contoh bekas dalam kod (Laravel)

laravel menyediakan apabila membuat instantiation perkhidmatan Apabila ia dimuatkan, contoh bekas laravel akan disuntik ke dalam $app ini. Jadi dalam pembekal perkhidmatan, kami sentiasa boleh mengakses contoh bekas laravel melalui $this->$app, tanpa menggunakan fungsi app() atau App Facade.

Untuk lebih banyak artikel teknikal laravel, sila lawati lajur tutorial laravel!

Atas ialah kandungan terperinci Dapatkan contoh bekas dalam kod (Laravel). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:杨子. Jika ada pelanggaran, sila hubungi admin@php.cn Padam