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

Dapatkan contoh bekas dalam kod (Laravel)

Lepaskan: 2021-08-09 09:16:51
ke hadapan
1988 orang telah melayarinya

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();
Salin selepas log masuk

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;;
});
Salin selepas log masuk
Salin selepas log masuk

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;
    }
}
Salin selepas log masuk

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;;
    }
}
Salin selepas log masuk

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;;
});
Salin selepas log masuk
Salin selepas log masuk

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
],
Salin selepas log masuk

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();
    }
}
Salin selepas log masuk

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!

Label berkaitan:
Kenyataan Laman Web ini
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
Isu terkini
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan