मैंने अपने प्रोजेक्ट में इस व्यू कंपोजर को बनाया है। लेकिन जब मैं साइट चलाता हूं तो यह कक्षा को कई बार चलाता है। मैं कुछ मेनू उत्पन्न करने के लिए आंशिक लूप का उपयोग कर रहा हूं यह वह जगह है जहां विचारों को कई बार बुलाया जाता है। और क्योंकि मैंने प्रत्येक दृश्य में दृश्य संगीतकार ( view()->composer('*', ViewComposer::class); ) सेट किया है, कक्षा को 200 से अधिक बार कहा जाता है। मैंने पहले संगीतकार और सिंगलेट्स का उपयोग नहीं किया था, इसलिए मुझे यकीन नहीं है कि मैं कहां गलत कर रहा हूं।

यह मेरा प्रदाता है:

namespace App\Providers;

use App\Http\Composers\ViewComposer;
use Illuminate\Support\ServiceProvider;

class ViewComposerServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap services.
     *
     * @return void
     */
    public function boot()
    {
        view()->composer('*', ViewComposer::class);
    }

    /**
     * Register services.
     *
     * @return void
     */
    public function register()
    {
        $this->app->singleton(ViewComposer::class);
    }

}

और यह मेरा विचार है संगीतकार

<?php 

namespace App\Http\Composers;

use Illuminate\Contracts\View\View;

class ViewComposer
{
    public function compose(View $view)
    {
        \Log::debug('view composer runned');
        if( auth()->check() ){
            $permissions = auth()->user()->permissions()
        }

        $view->with( "permissions", $permissions);
    }
}

यह काम करता है इसलिए सेवा प्रदाता config/app.php में पंजीकृत है। लेकिन जैसा कि मैंने कहा कि यह कई बार sql क्वेरी और क्लास चलाता है। मैं कहाँ गलत कर रहा हूँ?

0
Skeletor 27 अक्टूबर 2018, 16:39

1 उत्तर

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

@ डेवोन ने मुझे स्पष्ट कर दिया कि सिंगलटन के साथ बाध्यकारी एक बार कक्षा नहीं चलाना सुनिश्चित करता है, लेकिन इसे केवल एक बार तुरंत चालू करता है (लेकिन फिर भी कई बार चलने योग्य) मैंने प्रसंस्करण (एसक्यूएल क्वेरी) भाग को __ निर्माण में स्थानांतरित करने और परिणाम को कक्षा में संग्रहीत करने का निर्णय लिया। संपत्ति। तो प्रक्रिया केवल तभी बनाई जाएगी जब कक्षा केवल एक बार तत्काल हो जाती है और परिणाम सिंगलटन इंस्टेंस में रहता है।

<?php 

namespace App\Http\Composers;

use Illuminate\Contracts\View\View;

class ViewComposer
{
    public $permissions;

    public function __construct(){
        $this->initPermissions();
    }

    public function compose(View $view)
    {
        $view->with( "permissions", $permissions);
    }

    public function initPermissions(){
        if( auth()->check() ){
            $this->permissions = auth()->user()->permissions()
        }
    }
}

इसने मेरी समस्या को कई एसक्यूएल प्रक्रिया के साथ बार-बार हल किया। लेकिन अब मेरे पास काम करने के बहुत सारे विचार हैं। यह एक बड़ी समस्या नहीं हो सकती है, लेकिन मुझे लगता है कि इन मेनू को उत्पन्न करने का उचित तरीका दृश्य संगीतकार के भीतर लूप बनाना है, बजाय उन्हें @foreach और @include के साथ दृश्य के भीतर लूप करना। इस तरह मैं बार-बार लोड किए गए एकाधिक विचार नहीं कर सका। आपकी टिप के लिए @Devon धन्यवाद।

1
Skeletor 28 अक्टूबर 2018, 09:07