2017-07-24 4 views
1

Désolé pour la question débutant, mais je ne peux trouver aucun exemple sur la façon d'utiliser réellement les fournisseurs de services (la documentation Laravel montre seulement comment les créer). Comme le paginateur de Laravel ne fonctionne pas avec le groupage, je veux créer mon propre service de pagination, mais je ne sais pas comment injecter ce service dans le contrôleur. Le contrôleur de forum me jette l'exception: Class App\Http\Controllers\CustomPaginator does not exist, mais je pensais que si je lier la classe de service au conteneur de service, il peut être résolu en utilisant le nom personnalisé?Dans Laravel, comment dévier le service d'injection dans la méthode du contrôleur

Voici les fichiers:

app/Http/Contrôleurs/Pour

<?php 

namespace App\Http\Controllers; 

use App\ForumModel; 
use Illuminate\Http\Request; 

class Forum extends Controller 
{ 
    public function index($page = 1, CustomPaginator $paginator) 
    { 
     $topics = ForumModel::orderBy("sticky", "DESC")->orderBy("lastpost", "DESC"); 

     return view("forum", ["topics" => $topics]); 
    } 
} 

app/Fournisseurs/CustomPaginatorServiceProvider.php

<?php 

namespace App\Providers; 

use Illuminate\Support\ServiceProvider; 

class CustomPaginatorServiceProvider extends ServiceProvider 
{ 
    /** 
    * Bootstrap the application services. 
    * 
    * @return void 
    */ 
    public function boot() 
    { 
     // 
    } 

    /** 
    * Register the application services. 
    * 
    * @return void 
    */ 
    public function register() 
    { 
     $this->app->bind("CustomPaginator", CustomPaginatorServiceProvider::class); 
    } 

    public function a() 
    { 
     echo "It works!"; 
    } 
} 

table fournisseurs dans l'application config

'providers' => [ 

    /* 
    * Laravel Framework Service Providers... 
    */ 
    Illuminate\Auth\AuthServiceProvider::class, 
    Illuminate\Broadcasting\BroadcastServiceProvider::class, 
    Illuminate\Bus\BusServiceProvider::class, 
    Illuminate\Cache\CacheServiceProvider::class, 
    Illuminate\Foundation\Providers\ConsoleSupportServiceProvider::class, 
    Illuminate\Cookie\CookieServiceProvider::class, 
    Illuminate\Database\DatabaseServiceProvider::class, 
    Illuminate\Encryption\EncryptionServiceProvider::class, 
    Illuminate\Filesystem\FilesystemServiceProvider::class, 
    Illuminate\Foundation\Providers\FoundationServiceProvider::class, 
    Illuminate\Hashing\HashServiceProvider::class, 
    Illuminate\Mail\MailServiceProvider::class, 
    Illuminate\Notifications\NotificationServiceProvider::class, 
    Illuminate\Pagination\PaginationServiceProvider::class, 
    Illuminate\Pipeline\PipelineServiceProvider::class, 
    Illuminate\Queue\QueueServiceProvider::class, 
    Illuminate\Redis\RedisServiceProvider::class, 
    Illuminate\Auth\Passwords\PasswordResetServiceProvider::class, 
    Illuminate\Session\SessionServiceProvider::class, 
    Illuminate\Translation\TranslationServiceProvider::class, 
    Illuminate\Validation\ValidationServiceProvider::class, 
    Illuminate\View\ViewServiceProvider::class, 

    /* 
    * Package Service Providers... 
    */ 
    Laravel\Tinker\TinkerServiceProvider::class, 

    /* 
    * Application Service Providers... 
    */ 
    App\Providers\AppServiceProvider::class, 
    App\Providers\AuthServiceProvider::class, 
    // App\Providers\BroadcastServiceProvider::class, 
    App\Providers\EventServiceProvider::class, 
    App\Providers\RouteServiceProvider::class, 
    App\Providers\CustomPaginatorServiceProvider::class 

], 

Répondre

1

Ne pas lier CustomPaginatorServiceProvider intérieur CustomPaginatorServiceProvider

et lier une instance.

$this->app->bind('CustomPaginator', function() { 
    return new Services\CustomPaginator(); 
}); 
  1. créer fournisseur de services de CustomPaginatorServiceProvider
  2. registre fournisseur de servicesCustomPaginatorServiceProvider dans app config
  3. créer ServiceCustomPaginator
  4. bind ServiceCustomPaginator dans CustomPaginatorServiceProvider

BTW Vous pouvez lier ServiceCustomPaginator dans AppServiceProvider au lieu de créer nouveau fournisseur de services


config/app.php dans le tableau d'alias:

intérieur action du contrôleur:

public function someAction(\CustomPaginator $paginator) 
{ 
    dd($paginator); 
} 

Et si vous avez besoin de transmettre des données en méthode CustomPaginator __construct - il suffit d'écrire ceci dans ServiceProvider:

$this->app->bind(\App\Services\CustomPaginator::class, function() { 
    return new \App\Services\CustomPaginator($firstParam, $secondParam, ...); 
}); 
+0

Après la lecture la documentation j'étais assez sûr que les services sont juste des méthodes de la classe ServiceProvider. Surtout qu'il n'y a pas un seul mot sur la façon de créer des services, Y a-t-il une convention, ou est-ce que je peux écraser n'importe quelle classe que je veux dans le fournisseur? – Yotsuya

+0

@Yotsuya Je les stocke dans _app \ Services_) – skido

+0

Ok, donc c'est exactement ce que j'ai fait, j'ai enlevé 'CustomPaginatorServiceProvider' et j'ai lié mon CustomPaginator dans le' AppServiceProvider'. Maintenant, quand je l'appelle à partir de 'app()' helper, cela fonctionne comme prévu (j'utilise 'app() -> make (" CustomPaginator ")'; Cependant, en essayant l'injection de dépedance avec le nom lié me renvoie 'Class App \ Http \ Controllers \ CustomPaginator n'existe pas. »Que dois-je faire pour que le service puisse être injecté dans ma méthode de contrôleur? – Yotsuya