Бързо и мръсно
Е, една опция, както съм сигурен, че знаете, е да кеширате елементите вътре в контролерите, докато изгледът се изобразява. Подозирам, че не искате да правите това, тъй като е по-малко поддържаемо в дългосрочен план.
По-лесен за поддръжка (?) метод
Ако обаче програмата за зареждане/изобразяване на View не задейства събитие, където искате, можете да създадете такова. Тъй като всеки пакет/библиотека в Laravel 4 е зададен в контейнера на приложението, вие всъщност можете да замените библиотеката View с ваша собствена.
Стъпките, които бих предприел са:
- Създайте библиотека/пакет. Целта е да се създаде клас, който разширява логиката на изгледа на Laravel. След като разгледате, може да искате да разширите този - Това е фасадата
View
- Ако сте разширили фасадата на View с ваша собствена (известна още като ако моето предположение за файла в стъпка 1 е правилно), тогава просто ще трябва да замените псевдоним за View в
app/config/app.php
с вашия собствен.
Редактиране - Поиграх си малко с това. Въпреки че не съм непременно съгласен с кеширането на резултат от View, срещу кеширането на sql заявки или „по-тежките повдигания“, ето как бих направил това в Laravel 4:
Изобразяването на изглед в Laravel 4 не задейства събитие, което ни позволява да кешираме резултата от изглед. Ето как добавих тази функционалност за кеширане на резултата от изглед.
Може да помислите за последиците от кеширането на резултата от изглед. Например, това не заобикаля упоритата работа на разговора с база данни, за да получите данните, необходими за изгледа. Във всеки случай това дава добър преглед на разширяването или замяната на основните елементи.
Първо създайте пакет и настройте автоматичното му зареждане. Ще използвам пространството от имена Fideloper\View
. Автоматичното зареждане в composer.json
ще изглежда така:
"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 и ще добавим някаква логика, за да го кешираме (или не кешираме). Ето го 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
да работи като фасада. Имам публикация в блог за създаване на фасади на Laravel. Ето как да го постигнете в този случай:
Създайте фасадата за нашата нова среда. Ще го кръстим 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
. Имайте предвид, че това трябва да имитира функционалността на Illuminate\View\ViewServiceProvider
за създаване на разширения Environment
клас.
<?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 да зареди нашия доставчик на услуги и да замени фасадата View на Illuminate с нашата собствена. Редактиране app/config/app.php
:
Добавяне на доставчик на услуги:
'providers' => array(
// Other providers
'Fideloper\View\ViewServiceProvider',
),
Заменете фасадата View с нашата собствена:
'aliases' => array(
// Other Aliases
//'View' => 'Illuminate\Support\Facades\View',
'View' => 'Fideloper\View\ViewFacade',
),
След това ще можете да използвате каквато желаете логика в метода View::make()
!
Най-накрая
Струва си да се отбележи, че има някои модели за зареждане в множество „заявки“ на уеб заявка. Symfony, например, ви позволява да дефинирате контролерите като сървъри. Zend има (има?) концепция за Action Stacks, която ви позволява
... ефективно ви помага да създадете опашка от действия на [контролера], които да се изпълнят по време на заявката.
Може би бихте искали да проучите тази възможност в Laravel и да кеширате резултатите от тези „действия“ (срещу директно кеширане на изглед).
Просто мисъл, не препоръка.
person
fideloper
schedule
07.07.2013