Szukaj…
Wprowadzenie
Laravel umożliwia dostęp do różnych klas zwanych usługami. Niektóre usługi są dostępne od razu po wyjęciu z pudełka, ale możesz je utworzyć samodzielnie.
Z usługi można korzystać w wielu plikach aplikacji, takich jak kontrolery. Wyobraźmy sobie usługę Service OurService
implementującą getNumber()
zwracającą liczbę losową:
class SomeController extends Controller {
public function getRandomNumber()
{
return app(OurService::class)->getNumber();
}
}
Aby utworzyć usługę, wystarczy utworzyć nową klasę:
# app/Services/OurService/OurService.php
<?php
namespace App\Services\OurService;
class OurService
{
public function getNumber()
{
return rand();
}
}
W tej chwili możesz już korzystać z tej usługi w kontrolerze, ale za każdym razem będziesz potrzebować utworzyć nowy obiekt:
class SomeController extends Controller {
public function getRandomNumber()
{
$service = new OurService();
return $service->getNumber();
}
public function getOtherRandomNumber()
{
$service = new OurService();
return $service->getNumber();
}
}
Dlatego następnym krokiem jest zarejestrowanie usługi w kontenerze usług . Po zarejestrowaniu usługi w kontenerze usług nie trzeba tworzyć nowego obiektu za każdym razem, gdy jest to potrzebne.
Aby zarejestrować usługę w kontenerze usług, musisz utworzyć usługodawcę . Ten usługodawca może:
- Zarejestruj swoją usługę w kontenerze usług przy użyciu metody rejestracji )
- Wstrzykiwanie innych usług do usługi (zależności) za pomocą metody rozruchu
Usługodawca to klasa rozszerzająca klasę abstrakcyjną Illuminate\Support\ServiceProvider
. Musi zaimplementować metodę register()
, aby zarejestrować usługę w kontenerze usług :
# app/Services/OurService/OurServiceServiceProvider.php
<?php
namespace App\Services\OurService;
use Illuminate\Support\ServiceProvider;
class OurServiceServiceProvider extends ServiceProvider
{
public function register()
{
$this->app->singleton('OurService', function($app) {
return new OurService();
});
}
}
Wszyscy dostawcy usług są zapisani w tablicy w config/app.php
. Musimy więc zarejestrować naszego usługodawcę w tej tablicy:
return [
...
'providers' => [
...
App\Services\OurService\OurServiceServiceProvider::class,
...
],
...
];
Możemy teraz uzyskać dostęp do naszej usługi w kontrolerze. Trzy możliwości:
- Wstrzykiwanie zależności:
<?php
namespace App\Http\Controllers;
use App\Services\OurService\OurService;
class SomeController extends Controller
{
public function __construct(OurService $our_service)
{
dd($our_service->getNumber());
}
}
- Dostęp poprzez pomocnika
app()
:
<?php
namespace App\Http\Controllers;
use App\Services\OurService\OurService;
class SomeController extends Controller
{
public function getRandomNumber()
{
return app('OurService')->getNumber();
}
}
Laravel zapewnia Fasady, wyimaginowane klasy, które można wykorzystać we wszystkich swoich projektach i odzwierciedlają Usługę. Aby łatwiej uzyskać dostęp do usługi, możesz utworzyć fasadę:
<?php
namespace App\Http\Controllers;
use Randomisator;
class SomeController extends Controller
{
public function getRandomNumber()
{
return Randomisator::getNumber();
}
}
Aby utworzyć nową fasadę, musisz utworzyć nową klasę rozszerzającą Illuminate\Support\Facades\Facade
. Ta klasa musi implementować getFacadeAccessor()
i zwracać nazwę usługi zarejestrowanej przez dostawcę usług :
# app/Services/OurService/OurServiceFacade.php
<?php
namespace App\Services\OurService;
use Illuminate\Support\Facades\Facade;
class OurServiceFacade extends Facade
{
protected static function getFacadeAccessor()
{
return 'OurService';
}
}
Musisz także zarejestrować swoją fasadę w config/app.php
:
return [
...
'aliases' => [
....
'Randomisator' => App\Services\OurService\OurServiceFacade::class,
],
];
Fasada jest teraz dostępna w dowolnym miejscu w projekcie.
Jeśli chcesz uzyskać dostęp do usługi z poziomu widoków, możesz utworzyć funkcję pomocnika. Laravel jest dostarczany z niektórymi funkcjami pomocniczymi po wyjęciu z pudełka, takimi jak funkcja auth()
lub funkcja view()
. Aby utworzyć funkcję pomocnika, utwórz nowy plik:
# app/Services/OurService/helpers.php
if (! function_exists('randomisator')) {
/**
* Get the available OurService instance.
*
* @return \App\ElMatella\FacebookLaravelSdk
*/
function randomisator()
{
return app('OurService');
}
}
Musisz także zarejestrować ten plik, ale w pliku composer.json
:
{
...
"autoload": {
"files": [
"app/Services/OurService/helpers.php"
],
...
}
}
Możesz teraz używać tego pomocnika w widoku:
<h1>Here is a random number: {{ randomisator()->getNumber() }}</h1>