Cara Mengatur Fasad di Laravel 5.2 (di luar /app)

Saya bertanya/menjawab karena saya mengalami banyak kesulitan dalam menjalankannya dan saya ingin menunjukkan penerapan langkah demi langkah.

Referensi:


person Martin    schedule 25.02.2016    source sumber


Jawaban (1)


Ini mungkin bukan satu-satunya cara untuk mengimplementasikan fasad di Laravel 5, namun inilah cara saya melakukannya.

Kita akan membuat fasad Foo khusus yang tersedia di namespace Foobar.

1. Buat kelas khusus

Pertama, untuk contoh ini, saya akan membuat folder baru di proyek saya. Ia akan mendapatkan namespace sendiri yang akan membuatnya lebih mudah ditemukan.

Dalam kasus saya, direktori tersebut disebut Foobar:

masukkan deskripsi gambar di sini

Di sini, kita akan membuat file PHP baru dengan definisi kelas kita. Dalam kasus saya, saya menyebutnya Foo.php.

<?php
// %LARAVEL_ROOT%/Foobar/Foo.php

namespace Foobar;


class Foo
{
    public function Bar()
    {
        return 'got it!';
    }
}

2. Buat kelas fasad

Di folder baru yang mewah, kita dapat menambahkan file PHP baru untuk fasad kita. Saya akan menamainya FooFacade.php, dan saya meletakkannya di namespace berbeda yang disebut Foobar\Facades. Perlu diingat bahwa namespace dalam hal ini tidak mencerminkan struktur folder!

<?php
// %LARAVEL_ROO%/Foobar/FooFacade.php

namespace Foobar\Facades;


use Illuminate\Support\Facades\Facade;

class Foo extends Facade
{
    protected static function getFacadeAccessor()
    {
        return 'foo'; // Keep this in mind
    }
}
  • Ingatlah apa yang Anda kembalikan di getFacadeAccessor karena Anda akan membutuhkannya sebentar lagi.

Perhatikan juga bahwa Anda memperluas kelas Facade yang ada di sini.

3. Buat penyedia baru menggunakan php artisan

Jadi sekarang kita membutuhkan penyedia baru yang mewah. Untungnya kami memiliki alat artisan yang luar biasa. Dalam kasus saya, saya akan menyebutnya FooProvider.

php artisan make:provider FooProvider

Bam! Kami punya penyedianya. Baca selengkapnya tentang penyedia layanan di sini. Untuk saat ini, ketahuilah bahwa penyedia layanan memiliki dua fungsi (boot dan register ) dan kami akan menambahkan beberapa kode ke register. Kami akan mengikat penyedia baru kami pada aplikasi kami:

$this->app->bind('foo', function () {
    return new Foo; //Add the proper namespace at the top
});

Jadi bagian bind('foo' ini sebenarnya akan cocok dengan apa yang Anda masukkan ke dalam kode FooFacade.php Anda. Seperti yang saya katakan return 'foo'; sebelumnya, saya ingin ikatan ini cocok dengan itu. (Jika saya mengatakan return 'wtv'; saya akan mengatakan bind('wtv', di sini.)

Selanjutnya, kita perlu memberi tahu Laravel di mana menemukan Foo!

Jadi di bagian atas kita menambahkan namespace

use \Foobar\Foo;

Lihat seluruh file sekarang:

<?php
// %LARAVEL_ROOT%/app/Providers/FooProvider.php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Foobar\Foo;

class FooProvider extends ServiceProvider
{
    /**
     * Bootstrap the application services.
     *
     * @return void
     */
    public function boot()
    {
        //
    }

    /**
     * Register the application services.
     *
     * @return void
     */
    public function register()
    {
        $this->app->bind('foo', function () {
            return new Foo;
        });
    }
}
  • Pastikan Anda menggunakan Foobar\Foo dan bukan Foobar\Facades\Foo - IDE Anda mungkin menyarankan penyelesaian yang salah.

4. Tambahkan referensi kami ke config/app.php

Sekarang kita harus memberitahu Laravel bahwa kita tertarik menggunakan file acak yang baru saja kita buat, dan kita bisa melakukannya di file config/app.php kita.

  1. Tambahkan referensi kelas penyedia Anda ke 'providers': App\Providers\FooProvider::class

  2. Tambahkan referensi kelas fasad Anda ke 'aliases': 'Foo' => Foobar\Facades\Foo::class

Ingat, dalam alias, di mana saya menulis 'Foo', Anda ingin memasukkan nama yang ingin Anda referensikan pada fasad Anda di sana. Jadi jika Anda ingin menggunakan MyBigOlFacade::helloWorld() pada aplikasi Anda, awali baris tersebut dengan 'MyBigOlFacade' => MyApp\WhereEverMyFacadesAre\MyBigOlFacade::class

5. Perbarui composer.json Anda

Perubahan kode terakhir yang perlu Anda perlukan adalah memperbarui spasi psr-4 composer.json Anda . Anda harus menambahkan ini:

    "psr-4": {
        "Foobar\\" : "Foobar/",
        // Whatever you had already can stay
    }

Langkah terakhir

Oke jadi sekarang setelah semuanya berubah, hal terakhir yang Anda perlukan adalah menyegarkan cache di composer dan artisan. Coba ini:

composer dumpautoload
php artisan cache:clear

Penggunaan & Tes Cepat:

Buat rute di app/routes.php:

Route::get('/foobar', 'FooBarController@testFoo');

Lalu lari

php artisan make:controller FooBarController

Dan tambahkan beberapa kode sehingga sekarang terlihat seperti ini:

<?php

namespace App\Http\Controllers;

use Foobar\Facades\Foo;

use App\Http\Requests;

class FooBarController extends Controller
{
    public function testFoo()
    {
        dd(Foo::Bar());
    }
}

Anda akan mendapatkan string berikut:

masukkan deskripsi gambar di sini


Penyelesaian masalah

  • Jika Anda berakhir dengan kesalahan yang mengatakan tidak dapat menemukan kelas Foobar\Facades\Foo, coba jalankan php artisan optimize
person Martin    schedule 25.02.2016
comment
Tolong! Jika Anda menggunakan panduan ini dan ada yang tidak berfungsi - beri tahu saya agar saya dapat memperbaikinya! - person Martin; 26.02.2016
comment
Hal lain, saya menghilangkan pembersihan cache dan Laravel mengembalikan kesalahan Kelas tidak ditemukan, jadi saya menjalankan perintah php artisan optimize dan semuanya berfungsi - person IlGala; 01.03.2016
comment
Terima kasih @IlGala, saya telah melakukan beberapa pengeditan termasuk petunjuk tentang penggunaan perintah artisan optimize - person Martin; 02.03.2016
comment
Apa gunanya Foobar\Join;? Dan sayangnya yang saya dapatkan hasil akhirnya hanya Class 'Foobar\Facades\Foo' not found. Ikuti petunjuk di bawah surat itu. - person Jiho Kang; 23.08.2016
comment
Saya telah mengubah nama kelas saya sebelum memasukkannya ke dalam SO. Sepertinya saya lupa mengganti nama kelas itu! Seharusnya terbaca Foobar\Foo, menurutku. - person Martin; 23.08.2016