Laravel 5 में सभी विचारों का डेटा कैसे पास करें?


125

मैं अपने Laravel 5 अनुप्रयोग में सभी दृश्यों में कुछ डिफ़ॉल्ट डेटा सुलभ होना चाहता हूं।

मैंने इसके लिए खोज करने की कोशिश की है, लेकिन केवल लारवेल 4 के लिए ही नतीजे मिलते हैं। मैंने यहां 'शेयरिंग डेटा विद ऑल व्यू' का डॉक्यूमेंट पढ़ा है, लेकिन मुझे समझ नहीं आ रहा है कि क्या किया जाए। निम्नलिखित कोड कहाँ रखा जाना चाहिए?

View::share('data', [1, 2, 3]);

आपकी सहायता के लिए धन्यवाद।


इस आवश्यकता को प्रबंधित करने के लिए आपको स्टार्टअप कोड की आवश्यकता है?
Safoor Safdar

1
एक डेटाबेस कॉल के परिणामों के साथ एक सेवा प्रदाता में दृश्य :: शेयर का उपयोग करते हुए सिर एक ताज़ा डीबी माइग्रेशन चलाने या एक अगम्य डीबी कनेक्शन (लंबी कहानी, .env.dusk.bocal) के साथ डस्क चलाने की कोशिश करने पर एप्लिकेशन को त्रुटि देगा। सेवा प्रदाता द्वारा चलाए जाने के बाद ही उपयोग किया जाता है)। जैसा कि नीचे एक बेस कंट्रोलर या मिडलवेयर सबसे अच्छा है।
एंडी लोबेल

*विशेष रूप से db प्रश्नों का उपयोग करते समय , व्यू कंपोजर्स का उपयोग करते समय भी सावधानी बरतें , क्योंकि यह हर शामिल उप-दृश्य, घटक आदि के लिए चलाया जाता है, इसलिए आप सैकड़ों अनावश्यक प्रश्नों को चला सकते हैं, सबसे अच्छी बात यह है कि बेस व्यू जैसे लेआउट का उपयोग करें। एप्लिकेशन को फिर आवश्यकतानुसार डेटा पास करें।
एंडी लोबेल

जवाबों:


222

यह लक्ष्य विभिन्न विधि से प्राप्त कर सकता है,

1. बेसकंट्रोलर का उपयोग करना

जिस तरह से मैं चीजों को स्थापित करना पसंद करता हूं, मैं एक BaseControllerवर्ग बनाता हूं जो लारवेल के स्वयं के विस्तार करता है Controller, और वहां विभिन्न वैश्विक चीजों को स्थापित करता है। अन्य सभी नियंत्रक तब BaseControllerलारवेल के नियंत्रक के बजाय विस्तार करते हैं ।

class BaseController extends Controller
{
  public function __construct()
  {
    //its just a dummy data object.
    $user = User::all();

    // Sharing is caring
    View::share('user', $user);
  }
}

2. फ़िल्टर का उपयोग करना

यदि आप इस तथ्य के लिए जानते हैं कि आप संपूर्ण एप्लिकेशन पर प्रत्येक अनुरोध पर विचारों के लिए कुछ सेट अप करना चाहते हैं, तो आप इसे एक फ़िल्टर के माध्यम से भी कर सकते हैं जो अनुरोध से पहले चलता है - यह है कि मैं लारवेल में उपयोगकर्ता ऑब्जेक्ट के साथ कैसे व्यवहार करता हूं।

App::before(function($request)
{
  // Set up global user object for views
  View::share('user', User::all());
});

या

आप अपने स्वयं के फ़िल्टर को परिभाषित कर सकते हैं

Route::filter('user-filter', function() {
    View::share('user', User::all());
});

और साधारण फ़िल्टर कॉलिंग के माध्यम से इसे कॉल करें।

संस्करण 5 के अनुसार अद्यतन। * *

3. मिडिलवेयर का उपयोग करना

के View::shareसाथ का उपयोग करनाmiddleware

Route::group(['middleware' => 'SomeMiddleware'], function(){
  // routes
});



class SomeMiddleware {
  public function handle($request)
  {
    \View::share('user', auth()->user());
  }
}

4. व्यू कंपोजर का उपयोग करना

व्यू कम्पोज़र अलग-अलग तरीकों से देखने के लिए विशिष्ट डेटा को बांधने में मदद करता है। आप चर को सीधे विशिष्ट दृश्य या सभी दृश्यों से बांध सकते हैं। उदाहरण के लिए आप आवश्यकता के अनुसार अपने व्यू कंपोज़र फ़ाइल को स्टोर करने के लिए अपनी निर्देशिका बना सकते हैं। और सेवा के माध्यम से इन दृश्य संगीतकार फ़ाइल दृश्य के साथ बातचीत प्रदान करते हैं।

संगीतकार विधि अलग तरीके से उपयोग कर सकते हैं, पहला उदाहरण एक जैसे दिख सकते हैं:

आप एक App\Http\ViewComposersनिर्देशिका बना सकते हैं ।

सेवा प्रदाता

namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class ViewComposerServiceProvider extends ServiceProvider {
    public function boot() {
        view()->composer("ViewName","App\Http\ViewComposers\TestViewComposer");
    }
}

उसके बाद, इस प्रदाता को "प्रदाताओं" अनुभाग के तहत config / app.php में जोड़ें।

TestViewComposer

namespace App\Http\ViewComposers;

use Illuminate\Contracts\View\View;

class TestViewComposer {

    public function compose(View $view) {
        $view->with('ViewComposerTestVariable', "Calling with View Composer Provider");
    }
}

ViewName.blade.php

Here you are... {{$ViewComposerTestVariable}}

यह विधि केवल विशिष्ट दृश्य के लिए मदद कर सकती है। लेकिन अगर आप सभी विचारों के लिए ViewComposer को ट्रिगर करना चाहते हैं, तो हमें इस एकल परिवर्तन को ServiceProvider पर लागू करना होगा।

namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class ViewComposerServiceProvider extends ServiceProvider {
    public function boot() {
        view()->composer('*',"App\Http\ViewComposers\TestViewComposer");
    }
}

संदर्भ

लारवेल डॉक्यूमेंटेशन

आगे के लिए क्लेरिफिकेशन लाराकास्ट एपिसोड

अगर अभी भी मेरी तरफ से कुछ अस्पष्ट है, तो मुझे बताएं।


आपका उदाहरण register()विधि याद कर रहा है - यह वैकल्पिक नहीं है
जोनाथन

@ जोनाथन इसे इंगित करने के लिए धन्यवाद, लेकिन उदाहरण में केवल उन अनुभागों का ध्यान रखना है। देखने के साथ डेटा साझा करने के लिए परिप्रेक्ष्य।
सफूर सफदर

आप फ़िल्टर कहाँ लगाते हैं? शायद सबसे सही उत्तर अब मिडलवेयर समूहों laravel.com/docs/5.3/middleware#middleware-groups या वैश्विक मिडलवेयर का उपयोग कर रहा है
Toskan

7
यह एक अच्छा विचार नहीं है, देखें कंपोज़र्स प्रत्येक व्यक्ति के लिए कंपोज़र इंस्टेंस का निर्माण करते हैं इसका मतलब है कि यदि आप 1000 बार लूप चलाते हैं, तो 1000 कंपोज़र इंस्टेंस बनाए जाएंगे और 1000 बार फायरिंग ईवेंट को संभाला जाएगा, जो ऐसा कुछ नहीं है जो आप चाहते हैं।
रेजा शादमान

4
@RezaShadman सही है! मैंने इसे कठिन तरीके से सीखा। जब तक मैं जाँच करने के लिए लार्वा-डिबगबार उपकरण स्थापित नहीं करता, तब तक मेरा आवेदन इतना धीमा चल रहा था। तब मुझे अहसास हुआ कि सभी 8 प्रश्न जहां एक पृष्ठ लोड के लिए लगभग 15 बार निष्पादित किए जा रहे हैं। ऐसा इसलिए है क्योंकि दृश्य संगीतकार को प्रत्येक ब्लेड फ़ाइल के लिए बुलाया जाएगा जो शामिल है। यदि आप तारांकन का उपयोग कर रहे हैं *। यदि आप उपयोग नहीं कर रहे हैं *तो आपको ठीक होना चाहिए।
साइक्लोन

66

आप या तो अपना स्वयं का सेवा प्रदाता बना सकते हैं ( ViewServiceProviderनाम सामान्य है) या आप मौजूदा का उपयोग कर सकते हैं AppServiceProvider

अपने चयनित प्रदाता में, अपने कोड को बूट विधि में रखें।

public function boot() {
    view()->share('data', [1, 2, 3]);
}

यह $dataआपके सभी विचारों में एक चर को सुलभ बना देगा ।

यदि आप इसके बजाय मुखौटा के बजाय सहायक, परिवर्तन उपयोग करना चाहते हैं view()->के लिए View::है, लेकिन भूल नहीं है के लिए use View;अपनी फ़ाइल के शीर्ष पर।


धन्यवाद, महान काम। क्या बूट फ़ंक्शन इस तरह की चीज़ के लिए है या आप अपना स्वयं का सेवा प्रदाता बनाने की सलाह देते हैं?
रागनरसन

2
यदि आपको इसे साझा करने के लिए केवल एक या दो चीजें मिली AppServiceProviderहैं, तो यह ठीक है, लेकिन यदि आपको इससे अधिक कुछ मिलता है, तो आपको एक नया प्रदाता बनाने पर विचार करना चाहिए।
मैरवेल

यह काम कर रहा था लेकिन मैं सिर्फ यह देखता हूं कि आज यह काम नहीं कर रहा है! का उपयोग करते हुए composer updateभी काम नहीं कर रहा। दरअसल इसकी फायरिंग बिल्कुल नहीं boot()। मुझे दो चर साझा करने की आवश्यकता है।
itsazzad

11
ध्यान रखें कि यदि आप डेटाबेस रिकॉर्ड ला रहे हैं तो यह काम नहीं करेगा क्योंकि माइग्रेशन निष्पादित करने से पहले इसे कॉल किया जाएगा। इसलिए आप मूल रूप से डेटाबेस रिकॉर्ड लाने से पहले कोशिश कर रहे हैं। कम से कम मेरे लिए तो यही लगता है।
लॉरी

1
दुर्भाग्य से यह उपयोगकर्ता लॉग में लॉग इन करने के साथ काम करने के लिए प्रतीत नहीं होता है :: उपयोगकर्ता (), Safoor का # 1 जवाब, इस एक के नीचे, करता है :)
स्टेन स्मूल्ड्स

11

मुझे यह सबसे आसान लगा। '*'सभी विचारों को संलग्न करने के लिए एक नया प्रदाता और वाइल्डकार्ड बनाएं । 5.3 में काम करता है :-)

<?php

namespace App\Providers;

use Illuminate\Http\Request;
use Illuminate\Support\ServiceProvider;

class ViewServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap the application services.
     * @return void
     */
    public function boot()
    {
        view()->composer('*', function ($view)
        {
            $user = request()->user();

            $view->with('user', $user);
        });
    }

    /**
     * Register the application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }
}

2
इस प्रदाता को अपने कॉन्‍फ़िगरेशन / ऐप में प्रदाताओं की सरणी में जोड़ें "App \ Providers \ ViewServiceProvider :: class,"
Nadeem0035

8

सबसे अच्छा तरीका चर का उपयोग कर साझा किया जाएगा View::share('var', $value);

उपयोग करने के साथ समस्याएँ "*":

निम्नलिखित दृष्टिकोण पर विचार करें:

<?php
// from AppServiceProvider::boot()
$viewFactory = $this->app->make(Factory::class);

$viewFacrory->compose('*', GlobalComposer::class);

एक उदाहरण ब्लेड दृश्य से:

  @for($i = 0; $i<1000; $i++)
    @include('some_partial_view_to_display_i', ['toDisplay' => $i])
  @endfor

क्या होता है?

  • GlobalComposerवर्ग instantiated है 1000 का उपयोग कर बार App::make
  • घटना composing:some_partial_view_to_display_iको 1000 बार संभाला गया है।
  • composeसमारोह के अंदर GlobalComposerवर्ग 1000 बार कहा जाता है।

लेकिन आंशिक दृश्य some_partial_view_to_display_iका इससे बने चरों से कोई लेना-देना नहीं है, GlobalComposerबल्कि समय को बढ़ाता है।

सर्वश्रेष्ठ दृष्टिकोण?

View::shareएक समूहीकृत मिडलवेयर के साथ उपयोग करना ।

Route::group(['middleware' => 'WebMiddleware'], function(){
  // Web routes
});

Route::group(['prefix' => 'api'], function (){

});

class WebMiddleware {
  public function handle($request)
  {
    \View::share('user', auth()->user());
  }
}

अपडेट करें

यदि आप किसी ऐसी चीज का उपयोग कर रहे हैं जो मिडलवेयर पाइपलाइन पर गणना की जाती है तो आप बस उचित घटना सुन सकते हैं या पाइप लाइन के आखिरी हिस्से में व्यू शेयर मिडलवेयर डाल सकते हैं।


4

प्रलेखन में:

आमतौर पर, आप कॉल को सर्विस प्रोवाइडर के बूट मेथड में शेयर मेथड में रखते हैं। आप उन्हें AppServiceProvider में जोड़ने या उन्हें घर पर एक अलग सेवा प्रदाता बनाने के लिए स्वतंत्र हैं।

मैं Marwelln से सहमत हूं, बस इसे AppServiceProviderबूट फंक्शन में रखें:

public function boot() {
    View::share('youVarName', [1, 2, 3]);
}

मैं चर के लिए एक विशिष्ट नाम का उपयोग करने की सलाह देता हूं, अन्य 'वैश्विक' चर के साथ भ्रम या गलतियों से बचने के लिए।


3

दस्तावेज़ीकरण सुन रहा है https://laravel.com/docs/5.4/views#view-composers लेकिन मैं इसे तोड़ दूंगा

  1. अपने एप्लिकेशन की रूट डायरेक्टरी में डायरेक्टरी ऐप \ _ प्रोवाइडर्स की तलाश करें और फाइल कंपोजर सेवाप्रोवाइडर.फैप बनाएं और उसमें नीचे दिए गए टेक्स्ट को कॉपी करें और सेव करें।

    <?php
        namespace App\Providers;
        use Illuminate\Support\Facades\View;
        use Illuminate\Support\ServiceProvider;
    
        class ComposerServiceProvider extends ServiceProvider
        {
            /**
            * Register bindings in the container.
            *
            * @return void
            */
        public function boot()
        {
            // Using class based composers...
            View::composer(
                'profile', 'App\Http\ViewComposers\ProfileComposer'
            );
    
            // Using Closure based composers...
            View::composer('dashboard', function ($view) {
                //
            });
        }
    
        /**
        * Register the service provider.
        *
        * @return void
        */
        public function register()
        {
            //
        }
    }
  2. अपने एप्लिकेशन की जड़ से कॉन्फिगर / app.php खोलें और फ़ाइल में प्रोवाइडर्स सेक्शन को देखें और इस 'App \ Providers \ ComposerServiceProvider' को कॉपी करके अरेंज करें

ऐसा करके, हमने संगीतकार सेवा प्रदाता बनाया है। जब आप अपने एप्लिकेशन को व्यू प्रोफ़ाइल जैसे http: // yourdomain / something / profile से चलाते हैं , तो सेवा प्रदाता कंपोज़र सर्विसपॉइडर को कॉल किया जाता है और क्लास App \ Http \ ViewComposers \ ProfileComposer को कॉल किया जाता है। बूट विधि या कार्य।

 // Using class based composers...
 View::composer(
   'profile', 'App\Http\ViewComposers\ProfileComposer'
 );
  1. यदि आप अपने आवेदन को ताज़ा करते हैं तो आपको एक त्रुटि मिलेगी क्योंकि वर्ग App \ Http \ ViewComposers \ ProfileComposer अभी तक मौजूद नहीं है। अब इसे बनाने दें।

डायरेक्टरी पाथ ऐप / Http पर जाएं

  • ViewComposers नामक निर्देशिका बनाएँ

  • ProfileComposer.php फ़ाइल बनाएँ ।

    class ProfileComposer
    {
        /**
        * The user repository implementation.
        *
        * @var UserRepository
        */
        protected $users;
    
        /**
        * Create a new profile composer.
        *
        * @param  UserRepository  $users
        * @return void
        */
        public function __construct(UserRepository $users)
        {
            // Dependencies automatically resolved by service container...
            $this->users = $users;
        }
    
        /**
        * Bind data to the view.
        *
        * @param  View  $view
        * @return void
        */
        public function compose(View $view)
        {
            $view->with('count', $this->users->count());
        }
    }

अब अपने विचार पर जाएं या इस मामले में Profile.blade.php और जोड़ें

{{ $count }}

और जो प्रोफ़ाइल पृष्ठ पर उपयोगकर्ताओं की गिनती दिखाएगा।

सभी पृष्ठों को बदलने के लिए गिनती दिखाने के लिए

// Using class based composers...
View::composer(
    'profile', 'App\Http\ViewComposers\ProfileComposer'
);

सेवा

// Using class based composers...
View::composer(
    '*', 'App\Http\ViewComposers\ProfileComposer'
);

<? php और namespace App \ Http \ ViewComposers; Illuminate \ ठेके का उपयोग करें \ View \ View;
प्रोफाईल कॉमपोजर

1

मुझे लगता है कि सबसे अच्छा तरीका है View Composers। अगर कोई यहां आया है और यह देखना चाहता है कि व्यू कंपोजर्स के साथ यह कैसे कर सकता है, तो मेरा उत्तर पढ़ें => सभी विचारों के बीच एक चर कैसे साझा करें?


1

प्रलेखन यहाँ है https://laravel.com/docs/5.4/views#view-composers लेकिन मैं इसे नीचे 1.Look निर्देशिका प्रदाताओं के लिए अपने रूट निर्देशिका में ComposerServiceProvider.php के लिए सामग्री के साथ तोड़ने के लिए और पैदा करेगा


1

अपने कॉन्‍फ़िगर फ़ोल्डर के अंदर आप एक php फ़ाइल नाम बना सकते हैं, उदाहरण के लिए नीचे दी गई सामग्री के साथ "variable.php":

<?php

  return [
    'versionNumber' => '122231',
  ];

अब सभी दृश्यों के अंदर आप इसका उपयोग कर सकते हैं

config('variable.versionNumber')

मैं इसे कुछ मामलों में इस तरह से करता हूं, क्योंकि जानकारी वास्तव में वैश्विक है और आप इसे कहीं से भी एक्सेस कर सकते हैं। उस कारण से, मैं कॉन्फ़िगर फ़ाइल को "Global.php" कहता हूं और मैंने वहां कुछ भी डाल दिया है जो मैं अपने कोड के अन्य सभी भागों में सुलभ होना चाहता हूं। केवल सीमा यह है कि यह स्थैतिक डेटा के लिए है, और कैश हो जाता है। यदि आप लगातार डेटा बदल रहे हैं तो इसका उपयोग इस तरह से नहीं किया जाना चाहिए।
eResourcesInc

1

1) (app \ Providers \ AppServiceProvider.php)

// in boot function
       view()->composer('*', function ($view) {
            $data = User::messages();
            $view->with('var_messages',$data);
        });

2) अपने उपयोगकर्ता मॉडल में

  public static function messages(){ // this is just example
        $my_id = auth()->user()->id;
        $data= Message::whereTo($my_id)->whereIs_read('0')->get(); 
        return $data; // return is required
    }

3) आपके विचार में

 {{ $var_messages }}

0

लारवेल 5.6 विधि: https://laravel.com/docs/5.6/views#passing-data-to-views

उदाहरण, सभी विचारों (AppServiceProvider.php) के लिए एक मॉडल संग्रह साझा करने के साथ:

use Illuminate\Support\Facades\View;
use App\Product;

public function boot()
{
    $products = Product::all();
    View::share('products', $products);

}

2
यदि आप खाली डेटाबेस के साथ एक नया एप्लिकेशन बनाने का प्रयास कर रहे हैं, तो यह समस्याएँ पैदा करेगा।
क्रिस हर्बर्ट

0

आपके पास दो विकल्प हैं:

App \ Providers \ AppServiceProvider में बूट फ़ंक्शन के माध्यम से 1.Share

public function boot() { view()->share('key', 'value'); }

और किसी भी दृश्य फ़ाइल में $ कुंजी चर का उपयोग करें।

नोट: याद रखें कि आप यहाँ वर्तमान सत्र, प्रामाणिक, रूट डेटा तक नहीं पहुँच सकते। यदि आप स्थिर डेटा साझा करना चाहते हैं तो यह विकल्प अच्छा है। मान लीजिए कि आप वर्तमान उपयोगकर्ता, मार्ग या किसी कस्टम सत्र चर के आधार पर कुछ डेटा साझा करना चाहते हैं, तो आप ऐसा नहीं कर पाएंगे।

  1. एक सहायक वर्ग का उपयोग अपने आवेदन में कहीं भी एक सहायक वर्ग बनाएं और इसे कॉन्फ़िगर करें फ़ोल्डर में app.php फ़ाइल में अन्य उपनाम में दर्ज करें।

'aliases' => [ ..., 'Helper' => App\HelperClass\Helper::class, ],

और App फ़ोल्डर के भीतर HelperClass फ़ोल्डर में Helper.php बनाएं

namespace App\HelperClass;

class Helper
{
    public static function Sample()
    {
        //Your Code Here
    }
}

और इसे कहीं भी एक्सेस करें Helper::Sample()

आपको यहां प्रामाणिक, मार्ग, सत्र या किसी अन्य वर्ग का उपयोग करने के लिए प्रतिबंधित नहीं किया जाएगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.