Saya bertanya/menjawab karena saya mengalami banyak kesulitan dalam menjalankannya dan saya ingin menunjukkan penerapan langkah demi langkah.
Referensi:
Saya bertanya/menjawab karena saya mengalami banyak kesulitan dalam menjalankannya dan saya ingin menunjukkan penerapan langkah demi langkah.
Referensi:
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
.
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:
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!';
}
}
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
}
}
getFacadeAccessor
karena Anda akan membutuhkannya sebentar lagi.Perhatikan juga bahwa Anda memperluas kelas Facade yang ada di sini.
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;
});
}
}
Foobar\Foo
dan bukan Foobar\Facades\Foo
- IDE Anda mungkin menyarankan penyelesaian yang salah.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.
Tambahkan referensi kelas penyedia Anda ke 'providers'
: App\Providers\FooProvider::class
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
composer.json
AndaPerubahan 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
}
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
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:
Foobar\Facades\Foo
, coba jalankan php artisan optimize
artisan optimize
- person Martin; 02.03.2016
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
Foobar\Foo
, menurutku.
- person Martin; 23.08.2016