त्वरित और गंदा
ठीक है, एक ही विकल्प, के रूप में मुझे यकीन है कि आप जानते हैं हूँ, नियंत्रकों के अंदर आइटम कैश करने के लिए के रूप में देखें गाया जा रहा है। मुझे संदेह है कि आप ऐसा नहीं करना चाहते हैं, क्योंकि यह लंबे समय तक कम रखरखाव योग्य है।
अधिक पोषणीय (?) विधि
हालांकि, अगर देखें लोडर/रेंडरर एक घटना जहाँ आप चाहते हैं आग नहीं है, आप बना सकते हैं। चूंकि लार्वेल 4 में प्रत्येक पैकेज/लाइब्रेरी ऐप कंटेनर में सेट है, इसलिए आप वास्तव में व्यू लाइब्रेरी को अपने आप से बदल सकते हैं।
चरणों मैं ले जाएगा है:
- एक पुस्तकालय/पैकेज बनाएँ। लक्ष्य एक वर्ग बनाना है जो लैरवेल के दृश्य तर्क को बढ़ाता है। एक नज़र डालने के बाद, आप this one का विस्तार करना चाहेंगे - यह
View
मुखौटा
- यदि आपने व्यू फ़ेडेड को अपने आप के साथ बढ़ाया है (उर्फ अगर चरण 1 में फ़ाइल पर मेरी धारणा सही है), तो आपको बस आवश्यकता होगी alias for View को
app/config/app.php
में अपने आप से बदलने के लिए।
संपादित करें- मैंने इस के साथ खेला। यद्यपि मैं एक परिणाम परिणाम कैशिंग के साथ जरूरी नहीं हूं, बनाम एसक्यूएल प्रश्न या "भारी लिफ्ट" बना रहा हूं, यहां मैं लैरवेल 4:
लार्वेल 4 में दृश्य प्रतिपादन एक ऐसी घटना को आग नहीं डालें जो हमें एक दृश्य के परिणाम को कैश करे। यहां एक दृश्य के परिणाम को कैश करने के लिए मैंने उस कार्यक्षमता में कैसे जोड़ा है।
आप किसी व्यू के परिणाम को कैशिंग करने की विधियों पर विचार करना चाह सकते हैं।उदाहरण के लिए, यह देखने के लिए आवश्यक डेटा प्राप्त करने के लिए डेटाबेस से बात करने के कड़ी मेहनत के आसपास नहीं मिलता है। किसी भी मामले में, यह मूल वस्तुओं को विस्तार या बदलने पर एक अच्छा अवलोकन देता है।
सबसे पहले, एक पैकेज बनाएं और इसकी ऑटोलोडिंग सेट करें। मैं नामस्थान Fideloper\View
का उपयोग करूंगा। यह composer.json
वसीयत में Autoloading है इस तरह दिखता है:
"autoload": {
"classmap": [
"app/commands",
"app/controllers",
"app/models",
"app/database/migrations",
"app/database/seeds",
"app/tests/TestCase.php"
],
"psr-0": {
"Fideloper": "app/"
}
},
इसके बाद, View
मुखौटा बदलने के लिए एक वर्ग पैदा करते हैं। हमारे मामले में, इसका मतलब है कि हम Illuminate\View\Environment का विस्तार करेंगे।
इस कक्षा में, हम दृश्य के परिणाम का परिणाम लेंगे और इसे कैश (या कैश नहीं) में कुछ तर्क जोड़ देंगे। यहाँ Fideloper/View/Environment.php
है:
<?php namespace Fideloper\View;
use Illuminate\View\Environment as BaseEnvironment;
use Illuminate\View\View;
class Environment extends BaseEnvironment {
/**
* Get a evaluated view contents for the given view.
*
* @param string $view
* @param array $data
* @param array $mergeData
* @return \Illuminate\View\View
*/
public function make($view, $data = array(), $mergeData = array())
{
$path = $this->finder->find($view);
$data = array_merge($mergeData, $this->parseData($data));
$newView = new View($this, $this->getEngineFromPath($path), $view, $path, $data);
// Cache Logic Here
return $newView;
}
}
तो, कि जहां अपने काम के थोक होगा - कि // Cache Logic Here
को भरना। हालांकि, हमारे पास कुछ नलसाजी करने के लिए छोड़ दिया गया है।
अगला, हमें फेकाडे के रूप में काम करने के लिए हमारी नई Environment
कक्षा सेट अप करने की आवश्यकता है। मेरे पास creating Laravel facades पर एक ब्लॉग पोस्ट है। यहां इस मामले में इसे पूरा करने का तरीका बताया गया है:
हमारे नए पर्यावरण के लिए मुखौटा बनाएं। हम इसे कोड में fideloper.view
नाम देंगे।
<?php namespace Fideloper\View;
use Illuminate\Support\Facades\Facade;
class ViewFacade extends Facade {
/**
* Get the registered name of the component.
*
* @return string
*/
protected static function getFacadeAccessor() { return 'fideloper.view'; }
}
फिर, सेवा प्रदाता जो Laravel बता देंगे जब fideloper.view
कहा जाता है क्या बनाने के लिए पैदा करते हैं। ध्यान दें कि विस्तारित Environment
कक्षा बनाने के लिए इसे Illuminate\View\ViewServiceProvider
की कार्यक्षमता की नकल करने की आवश्यकता है।
<?php namespace Fideloper\View;
use Illuminate\Support\ServiceProvider;
class ViewServiceProvider extends ServiceProvider {
public function register()
{
$this->app['fideloper.view'] = $this->app->share(function($app)
{
// Next we need to grab the engine resolver instance that will be used by the
// environment. The resolver will be used by an environment to get each of
// the various engine implementations such as plain PHP or Blade engine.
$resolver = $app['view.engine.resolver'];
$finder = $app['view.finder'];
$env = new Environment($resolver, $finder, $app['events']);
// We will also set the container instance on this view environment since the
// view composers may be classes registered in the container, which allows
// for great testable, flexible composers for the application developer.
$env->setContainer($app);
$env->share('app', $app);
return $env;
});
}
}
अंत में, हम यह सब एक साथ हुक और Laravel बता हमारी सेवा प्रदाता लोड और अपने स्वयं के साथ रोशन के दृश्य मुखौटा बदलने के लिए की जरूरत है। संपादित app/config/app.php
:
'providers' => array(
// Other providers
'Fideloper\View\ViewServiceProvider',
),
हमारे अपने साथ देखें मुखौटा बदलें::
'aliases' => array(
// Other Aliases
//'View' => 'Illuminate\Support\Facades\View',
'View' => 'Fideloper\View\ViewFacade',
),
फिर आप View::make()
विधि में जो कुछ भी तर्क आप चाहते हैं का उपयोग कर सकेंगे
सेवा प्रदाता जोड़े !
अंत में
वेब अनुरोध के अनुसार कई "अनुरोध" में लोड करने के लिए कुछ पैटर्न देखते हैं कि यह ध्यान देने योग्य है। उदाहरण के लिए, सिम्फनी, आप define controllers as servers हैं। ज़ेंड ने एक्शन स्टैक्स की एक अवधारणा है (जो?) आपको
... अनुरोध के दौरान निष्पादित करने के लिए प्रभावी रूप से [नियंत्रक] कार्रवाइयों की कतार बनाने में आपकी सहायता करता है।
शायद आप लैरवेल के भीतर उस संभावना का पता लगाना चाहते हैं, और उन "क्रियाओं" के परिणाम कैश करना (सीधे दृश्य को कैशिंग करना)।
बस एक विचार, सिफारिश नहीं।
मैं पूछना अगर तुम एक तरह से फिर से बनाए गए दृश्य डेटा से बचने के लिए के रूप में में यह कर रहे हैं सकता है -
लिंक करने के लिए: आप निम्न विधियों के माध्यम से ऐसा कर सकते हैं? क्या आपको अभी भी दृश्य बनाने के लिए डेटाबेस को हिट करने की आवश्यकता है, भले ही दृश्य परिणाम स्वयं कैश में सहेजा गया हो? सर्विसप्रोवाइडर और फेकाड्स (मैं +2 या +3 अगर मैं कर सकता था!) के लिए एक बेहद विस्तृत मार्गदर्शिका के लिए – fideloper