Điều này có thể không phải là cách duy nhất để thực hiện mặt tiền trong Laravel 5, nhưng đây là làm thế nào tôi đã làm nó.
Chúng tôi sẽ tạo một mặt tiền tùy chỉnh Foo
có sẵn trong không gian tên Foobar
.
1. Tạo một lớp tùy chỉnh
Đầu tiên, ví dụ này, tôi sẽ tạo ra một thư mục mới trong dự án của tôi. Nó sẽ nhận được namespace của riêng nó mà sẽ làm cho nó dễ dàng hơn để tìm.
Trong trường hợp của tôi thư mục được gọi là Foobar:
Tại đây, chúng tôi sẽ tạo ra một file PHP mới với định nghĩa lớp của chúng tôi. Trong trường hợp của tôi, tôi gọi nó là Foo.php
.
<?php
// %LARAVEL_ROOT%/Foobar/Foo.php
namespace Foobar;
class Foo
{
public function Bar()
{
return 'got it!';
}
}
2. Tạo một lớp mặt tiền
Trong thư mục mới ưa thích của chúng tôi, chúng ta có thể thêm một file PHP mới cho mặt tiền của chúng tôi. Tôi sẽ gọi nó là FooFacade.php
và tôi đặt nó vào một không gian tên khác được gọi là Foobar \ Facades. Hãy nhớ rằng không gian tên trong trường hợp này không phản ánh cấu trúc thư mục!
<?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
}
}
- Ghi nhớ những gì bạn quay lại trong
getFacadeAccessor
vì bạn sẽ cần rằng trong một khoảnh khắc.
Cũng lưu ý rằng bạn đang mở rộng lớp hiện tại Facade tại đây.
3. Tạo một nhà cung cấp mới sử dụng php artisan
Vì vậy, bây giờ chúng ta cần mình một nhà cung cấp mới lạ mắt. Rất may, chúng tôi có công cụ tuyệt vời artisan
. Trong trường hợp của tôi, tôi sẽ gọi nó là FooProvider
.
php artisan make:provider FooProvider
Bam! Chúng tôi có một nhà cung cấp. Read more about service providers here. Bây giờ chỉ cần biết rằng nó có hai chức năng (boot
và register
) và chúng tôi sẽ thêm một số mã vào register
.Chúng ta sẽ bind cung cấp dịch vụ mới của chúng tôi ứng dụng của chúng tôi:
$this->app->bind('foo', function() {
return new Foo; //Add the proper namespace at the top
});
Vì vậy, phần bind('foo'
này thực sự sẽ phù hợp với những gì bạn đặt trong mã FooFacade.php
của bạn. Ở đây tôi đã nói return 'foo';
trước đây, tôi muốn liên kết này khớp với điều đó. (Nếu tôi đã nói return 'wtv';
Tôi muốn nói bind('wtv',
tại đây.)
Hơn nữa, chúng ta cần phải nói cho Laravel biết nơi để tìm Foo
!
Vì vậy, ở phía trên chúng ta thêm namespace
use \Foobar\Foo;
Kiểm tra toàn bộ hồ sơ tại:
<?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;
});
}
}
- Hãy chắc chắn rằng bạn sử dụng
Foobar\Foo
và không Foobar\Facades\Foo
- IDE của bạn có thể đề nghị hoàn thành sai.
4. Thêm tài liệu tham khảo của chúng tôi để config/app.php
Bây giờ chúng ta phải nói với Laravel chúng tôi quan tâm đến việc sử dụng các tập tin ngẫu nhiên chúng tôi vừa tạo ra, và chúng ta có thể làm điều đó trong tập tin config/app.php
của chúng tôi.
Thêm lớp tham khảo nhà cung cấp để 'providers'
: App\Providers\FooProvider::class
Thêm lớp tham khảo mặt tiền của bạn để 'aliases'
: 'Foo' => Foobar\Facades\Foo::class
Hãy nhớ rằng, trong bí danh, nơi tôi đã viết 'Foo'
, bạn sẽ muốn đặt tên bạn muốn tham khảo mặt tiền của bạn với ở đó. Vì vậy, nếu bạn muốn sử dụng MyBigOlFacade::helloWorld()
xung quanh ứng dụng của bạn, bạn sẽ bắt đầu dòng với 'MyBigOlFacade' => MyApp\WhereEverMyFacadesAre\MyBigOlFacade::class
5. Cập nhật của bạn composer.json
Mã thay đổi cuối cùng bạn nên cần là để cập nhật composer.json
của bạn 's psr-4
không gian. Bạn sẽ phải thêm này:
"psr-4": {
"Foobar\\" : "Foobar/",
// Whatever you had already can stay
}
cuối cùng di chuyển
Được rồi vì vậy bây giờ rằng bạn có tất cả những gì thay đổi, điều cuối cùng bạn cần là để làm mới bộ nhớ đệm trong cả hai nhà soạn nhạc và nghệ nhân.Hãy thử điều này:
composer dumpautoload
php artisan cache:clear
Cách sử dụng & Một Quick Test:
Tạo tuyến đường trong app/routes.php
:
Route::get('/foobar', '[email protected]');
Sau đó chạy
php artisan make:controller FooBarController
Và thêm một số mã để nó bây giờ trông như thế này:
<?php
namespace App\Http\Controllers;
use Foobar\Facades\Foo;
use App\Http\Requests;
class FooBarController extends Controller
{
public function testFoo()
{
dd(Foo::Bar());
}
}
Bạn nên kết thúc với chuỗi sau:
đáp thắc mắc
- Nếu bạn kết thúc với và lỗi nói rằng nó không thể tìm thấy những lớp
Foobar\Facades\Foo
, thử chạy php artisan optimize
** Xin vui lòng! ** Nếu bạn sử dụng hướng dẫn này và một cái gì đó không hoạt động - hãy cho tôi biết để tôi có thể sửa nó! – Martin
Lệnh cuối cùng là bộ nhớ cache: xóa bộ nhớ cache: xóa – IlGala
Một điều nữa, tôi bỏ qua bộ nhớ cache rõ ràng và Laravel trả lại cho tôi "Lỗi không tìm thấy lớp", vì vậy tôi chạy lệnh ** tối ưu hóa php artisan ** và mọi thứ đã hoạt động – IlGala