2016-02-25 21 views

Trả lời

13

Đ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:

enter image description here

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 (bootregister) 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.

  1. Thêm lớp tham khảo nhà cung cấp để 'providers': App\Providers\FooProvider::class

  2. 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:

enter image description here


đá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
+0

** 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

+1

Lệnh cuối cùng là bộ nhớ cache: xóa bộ nhớ cache: xóa – IlGala

+2

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

Các vấn đề liên quan