Sök…
Introduktion
Laravel ger tillgång till en mängd olika klasser som kallas tjänster. Vissa tjänster är tillgängliga utanför rutan, men du kan skapa dem själv.
En tjänst kan användas i flera filer i applikationen, som kontroller. Låt oss föreställa oss en tjänst OurService
implementerar en getNumber()
-metod som returnerar ett slumpmässigt nummer:
class SomeController extends Controller {
public function getRandomNumber()
{
return app(OurService::class)->getNumber();
}
}
För att skapa en tjänst behövs det bara att skapa en ny klass:
# app/Services/OurService/OurService.php
<?php
namespace App\Services\OurService;
class OurService
{
public function getNumber()
{
return rand();
}
}
För närvarande kan du redan använda den här tjänsten i en controller, men du skulle behöva instansera ett nytt objekt varje gång du skulle behöva det:
class SomeController extends Controller {
public function getRandomNumber()
{
$service = new OurService();
return $service->getNumber();
}
public function getOtherRandomNumber()
{
$service = new OurService();
return $service->getNumber();
}
}
Det är därför nästa steg är att registrera din tjänst i servicebehållaren . När du registrerar din tjänst i servicebehållaren behöver du inte skapa ett nytt objekt varje gång du behöver det.
För att registrera en tjänst i servicebehållaren måste du skapa en tjänsteleverantör . Denna tjänsteleverantör kan:
- Registrera din tjänst i servicebehållaren med registermetoden )
- Injicera andra tjänster i din tjänst (beroende) med startmetoden
En tjänsteleverantör är en klass som utvidgar den abstrakta klassen Illuminate\Support\ServiceProvider
. Den måste implementera metoden register()
för att registrera en tjänst i servicebehållaren :
# 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();
});
}
}
Alla tjänsteleverantörer sparas i en matris i config/app.php
. Så vi måste registrera vår tjänsteleverantör i denna grupp:
return [
...
'providers' => [
...
App\Services\OurService\OurServiceServiceProvider::class,
...
],
...
];
Vi kan nu komma åt vår tjänst i en controller. Tre möjligheter:
- Beroende på injektion:
<?php
namespace App\Http\Controllers;
use App\Services\OurService\OurService;
class SomeController extends Controller
{
public function __construct(OurService $our_service)
{
dd($our_service->getNumber());
}
}
- Åtkomst via hjälpen för
app()
:
<?php
namespace App\Http\Controllers;
use App\Services\OurService\OurService;
class SomeController extends Controller
{
public function getRandomNumber()
{
return app('OurService')->getNumber();
}
}
Laravel tillhandahåller fasader, imaginära klasser som du kan använda i alla dina projekt och reflektera en tjänst. För att få åtkomst till din tjänst lättare kan du skapa en fasad:
<?php
namespace App\Http\Controllers;
use Randomisator;
class SomeController extends Controller
{
public function getRandomNumber()
{
return Randomisator::getNumber();
}
}
För att skapa en ny fasad måste du skapa en ny klass som utvidgar Illuminate\Support\Facades\Facade
. Denna klass måste implementera getFacadeAccessor()
och returnera namnet på en tjänst registrerad av en tjänsteleverantör :
# 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';
}
}
Du måste också registrera din fasad i config/app.php
:
return [
...
'aliases' => [
....
'Randomisator' => App\Services\OurService\OurServiceFacade::class,
],
];
Fasaden är nu tillgänglig var som helst i ditt projekt.
Om du vill komma åt din tjänst från dina vyer kan du skapa en hjälpfunktion. Laravel-fartyg med vissa hjälpare fungerar utanför rutan, som auth()
-funktionen eller view()
-funktionen. Skapa en ny fil för att skapa en hjälpfunktion:
# app/Services/OurService/helpers.php
if (! function_exists('randomisator')) {
/**
* Get the available OurService instance.
*
* @return \App\ElMatella\FacebookLaravelSdk
*/
function randomisator()
{
return app('OurService');
}
}
Du måste också registrera den här filen, men i din composer.json
fil:
{
...
"autoload": {
"files": [
"app/Services/OurService/helpers.php"
],
...
}
}
Du kan nu använda den här hjälpen i en vy:
<h1>Here is a random number: {{ randomisator()->getNumber() }}</h1>