मैं अपने Laravel एप्लिकेशन में डुप्लिकेट कोड के लिए ServiceProvider बनाने का प्रयास कर रहा हूं। मेरा समाधान एक अपवाद फेंकता है:

Illuminate \ Contracts \ Container \ BindingResolutionException:

Unresolvable dependency resolving [Parameter #0 [ <required> string $shortName ]] in class App\Domain\Translation\GetTranslation

मेरे पास एक कस्टम अमूर्त नियंत्रक है जहां मेरे पास एक साधारण सिंगलटन फ़ंक्शन है:

namespace App\Http\Controllers\WWW;

class CustomController {
(...)
        app()->singleton(
            GetTranslation::class, function() {
            return new GetTranslation(
                TrimSuffixFromUrl::getShortName(),
                LanguageMap::getLanguageIdByCode(\LaravelLocalization::getCurrentLocale()),
                app()->make(CurrentLanguage::class)
            );
        });
(...)
}

इस सिंगलटन का उपयोग CreateAccount नामक एक ठोस नियंत्रक में किया जाता है:

class CreateAccount extends ControllerWWW
{
    public function index(Request $request, DbInstanceFactory $dbInstance, GetTranslation $translation)
    {
        $getTranslation = $translation; // For simplify this example I remove logic
        // (...)
    }

मैं ServiceProvider बनाना चाहता हूं:

<?php 
declare(strict_types=1);

namespace App\Providers;

use App\Domain\Domains\Prefix\TrimSuffixFromUrl;
use App\Domain\Language\CurrentLanguage;
use App\Domain\Translation\GetTranslation;
use App\Repository\LanguageMap;
use Illuminate\Support\ServiceProvider;

/**
 * Class TranslatioServiceProvider
 * @package App\Providers
 */
class TranslationServiceProvider extends ServiceProvider
{
    protected $defer = true;

    /**
     * Register the service provider.
     *
     * @return void
     */
    public function register(): void
    {
        app()->singleton(
            GetTranslation::class, function() {
                return new GetTranslation(
                    TrimSuffixFromUrl::getShortName(),
                    LanguageMap::getLanguageIdByCode(\LaravelLocalization::getCurrentLocale()),
                    app()->make(CurrentLanguage::class)
                );
            }
        );
    }

    /**
     * @return array
     */
    public function provides(): array
    {
        parent::provides();

        return [GetTranslation::class];
    }
}

और मैं इस सेवा को app.php में जोड़ता हूं:

'providers' => [
    App\Providers\TranslationServiceProvider::class,
]

मुझे पता है कि लैरावेल इस सेवा के लिए निर्भरता को हल करने का प्रयास करता है लेकिन मुझे नहीं पता कि नियंत्रक में प्राइमेटिव को हल करने के लिए यह कोड कैसे लिखना है।

दूसरी ओर, यह वर्ग - GetTranslation - मेरे विचारों से जुड़ा है, उदाहरण के लिए:

<?php
// resources/lang/br/validation.php
declare(strict_types=1);

$translation = app()->make(\App\Domain\Translation\GetTranslation::class);

return [
    'required' => $translation->getTranslationsByKey('tranlation_my_key')
];

इस सेवा प्रदाता को नियंत्रक और विचारों में कैसे चलाएं - लेकिन मुझे सार नियंत्रक में ->singleton() विधि चलाने की आवश्यकता नहीं है। मुझे लगता है कि इस विधि के लिए जगह प्रदाता फ़ोल्डर में है, नियंत्रकों में नहीं।

0
Marek 18 फरवरी 2019, 21:15

1 उत्तर

सबसे बढ़िया उत्तर

मैं इस समस्या को इस तरह हल करता हूं:

  1. TranslationInterface बनाएं - यहां तक ​​कि खाली भी।
  2. इस इंटरफ़ेस को GetTranslation::class में लागू करें जैसे:
class GetTranslation implements TranslationInterface {}
  1. मैं app()->make(GetTranslation::class); के सभी उपयोग ढूंढता हूं और उन्हें app()->make(TranslationInterface::class); से बदल देता हूं
0
Marek 19 फरवरी 2019, 07:44