SearchExtension – použití v jiné CompilerExtension

před 13 dny

Gappa
Člen | 118
+
0
-

Ahoj,

o SearchExtension vím a funguje skvěle.

Jde ale tomuto rozšíření předat po zaregistrování nějaké jiné extension další místa (a nastavení), kde hledat služby?

před 13 dny

Felix
Nette Core | 971
+
+1
-

Ahoj. Vzdycky si danou extension muzes nainstancovat sam a ovladat ji dle potreby.

<?php

use Nette\DI\CompilerExtension;
use Nette\DI\Extensions\SearchExtension;

class MyExtension extends CompilerExtension
{

	public function loadConfiguration()
	{
		$config = [...];

		$ext = new SearchExtension($this->tempDir);
		$ext->setCompiler($this->compiler, $this->prefix('innersearch'));
		$ext->setConfig($config);

		$ext->loadConfiguration();
		$ext->beforeCompile();

		$ext->findClasses($config);
	}

}

před 13 dny

Gappa
Člen | 118
+
0
-

Díky za nakopnutí, já se původně snažil buď nějak „hijacknout“ globální $config, kam bych doplnil ono nastavení/sekce (nereagovalo), nebo nějak získal tuto službu (nějak se skrývá, nejde vzít z kontejneru).

před 13 dny

Gappa
Člen | 118
+
0
-

Funkční prototyp:

<?php
declare(strict_types=1);

use Nette\DI\Extensions\SearchExtension;
use Nette\DI\InvalidConfigurationException;
use Nette\Schema\Processor;
use Nette\Schema\Schema;
use Nette\Schema\ValidationException;

final class Extension extends CompilerExtension
{

	public function loadConfiguration(): void
	{
		$builder = $this->getContainerBuilder();

		$extConfig = [
			'in' => __DIR__ . '/../',
			'classes' => [
				'*Facade',
				'*Package',
				'*Factory',
				'*Presenter',
				'*Repository',
			]
		];

		$name = 'packagesearch';
		$searchExt = new SearchExtension($builder->parameters['tempDir'] . '/cache/' . $name);
		$searchExt->setCompiler($this->compiler, $this->prefix($name));
		$config = $this->processSchema($searchExt->getConfigSchema(), $extConfig);
		$searchExt->setConfig($config);
		$searchExt->loadConfiguration();
		$searchExt->beforeCompile();
	}


	/**
	 * Merges and validates configuration against scheme.
	 * @param Schema $schema
	 * @param array $config
	 * @return array|object
	 */
	private function processSchema(Schema $schema, array $config)
	{
		$processor = new Processor;
		try {
			return $processor->process($schema, $config);
		} catch (ValidationException $e) {
			throw new InvalidConfigurationException($e->getMessage());
		}
	}
}

Doplnění:

  • Metoda findClasses není potřeba volat ručně, volá se už v loadConfiguration.
  • Pro větší pohodlí jsem tam doplnil validaci pomocí Scheme, když už tam je :)

Editoval Gappa (3. 2. 21:03)

před 13 dny

Felix
Nette Core | 971
+
0
-

Pekny. BeforeCompile bych volal tez v beforeCompile. At zachovas lifecycle.

před 12 dny

Gappa
Člen | 118
+
0
-

Felix napsal(a):

Pekny. BeforeCompile bych volal tez v beforeCompile. At zachovas lifecycle.

To jsem zkoušel, ale pokud je takto zaregistrovaný jakýkoliv presenter, tak pak začne Nette vyhazovat následující chybu:

Error
Call to a member function isSent() on null

File: .../src/Application/UI/Presenter.php:200

190:
191:
192:        public function run(Application\Request $request): Application\IResponse
193:        {
194:            try {
195:                // STARTUP
196:                $this->request = $request;
197:                $this->payload = $this->payload ?: new \stdClass;
198:                $this->setParent($this->getParent(), $request->getPresenterName());
199:
200:                if (!$this->httpResponse->isSent()) {
201:                    $this->httpResponse->addHeader('Vary', 'X-Requested-With');
202:                }
203:
204:                $this->initGlobalParameters();

Vůbec se nevytvoří httpResponse objekt, pokud se v browseru snažím dostat na takto zaregistrovaný presenter.

Pokud beforeCompile() zavolám v loadConfiguration(), tak je vše ok – divné :)

před 12 dny

CZechBoY
Člen | 3462
+
0
-

Ukaž jak si to měl s tím beforeCompile… Podle mě sis jen udělal 2 instance SearchExtension.

před 12 dny

Gappa
Člen | 118
+
0
-

Takto:

<?php
declare(strict_types=1);

use Nette\DI\CompilerExtension;
use Nette\DI\Extensions\SearchExtension;
use Nette\DI\InvalidConfigurationException;
use Nette\Schema\Processor;
use Nette\Schema\Schema;
use Nette\Schema\ValidationException;

final class Extension extends CompilerExtension
{
	/** @var SearchExtension */
	private $searchExt;


	public function loadConfiguration(): void
	{
		$builder = $this->getContainerBuilder();

		$extConfig = [
			'in' => __DIR__ . '/../',
			'classes' => [
				'*Facade',
				'*Package',
				'*Factory',
				'*Presenter',
				'*Repository',
			]
		];

		$name = 'packagesearch';
		$this->searchExt = new SearchExtension($builder->parameters['tempDir'] . '/cache/' . $name);
		$this->searchExt->setCompiler($this->compiler, $this->prefix($name));
		$config = $this->processSchema($this->searchExt->getConfigSchema(), $extConfig);
		$this->searchExt->setConfig($config);
		$this->searchExt->loadConfiguration();

	}


	public function beforeCompile(): void
	{
		$this->searchExt->beforeCompile();
	}


	/**
	 * Merges and validates configuration against scheme.
	 * @param Schema $schema
	 * @param array $config
	 * @return array|object
	 */
	private function processSchema(Schema $schema, array $config)
	{
		$processor = new Processor;
		try {
			return $processor->process($schema, $config);
		} catch (ValidationException $e) {
			throw new InvalidConfigurationException($e->getMessage());
		}
	}
}

Editoval Gappa (4. 2. 10:06)