Předání závislostí do MacroSetu

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Martin Vaněk
Člen | 10
+
0
-

Dobrý den všem,

dostal jsem se na další hranici Nette, kde si bohužel nedokážu poradit sám a proto se ptám. Jen pro ujištění, s Nette pracuji teprve druhý týden a snažil jsem se odpovědi najít v diskusi. Bezvýsledně.

Mám následující makro –

<?php

namespace App\Macros;

use App\Managers\WarehouseManager;
use Latte\Compiler;
use Latte\MacroNode;
use Latte\Macros\MacroSet;
use Latte\PhpWriter;

/**
 * Class WarehouseMacros
 * @package App\Macros
 */
class WarehouseMacros extends MacroSet
{
        /** @var  WarehouseManager */
        private $warehouseManager;

        public static function install(Compiler $compiler)
        {
                $latteCompiler = new static($compiler);
                $latteCompiler->addMacro('onStock', array($latteCompiler, 'macroOnStock'));
        }

        public function macroOnStock(MacroNode $node, PhpWriter $writer)
        {
                $node->modifiers = preg_replace('#\|safeurl\s*(?=\||\z)#i', '', $node->modifiers);
                return $writer->using($node, $this->getCompiler())
                              ->write("echo %escape('asds')");
        }

        /**
         * @param WarehouseManager $warehouseManager
         */
        public function setWarehouseManager($warehouseManager)
        {
                $this->warehouseManager = $warehouseManager;
        }

}

Které registruji v config.neon takto –

nette.latteFactory:
        setup:
            - 'App\Macros\WarehouseMacros::install(?->getCompiler())'(@self)
            - addFilter('onStock')

Jak je vidět v kódu MacroSetu, potřebuji tam nějak elegantně procpat WarehouseManager, který mám zaregistrovaný jako službu. Mohl by mě někdo navést, zda to takhle půjde, nebo musim vytvořit rozšíření? Vedl jsem se podle tohoto tématu. Nicméně tam Macro není na ničem závislé.

Děkuji předem.

Zax
Člen | 370
+
0
-

Střílím trochu od boku, ale mohlo by to jít nějak takhle:

services:
	warehouseManager: App\Managers\WarehouseManager

	nette.latteFactory:
		setup:
			- 'App\Macros\WarehouseMacros::install(?->getCompiler(), ?)'(@self, @warehouseManager)
			- addFilter('onStock')

+ přidat parametr do metody install a přetížit konstruktor.

Editoval Zax (28. 4. 2015 20:58)