Nacitanie parametrov z config.neon pre extension

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

Ahoj,

snažím sa nejako vytvoriť extension do Nette aby som mohol využívať sendgrid. Sendgrid sa naťahuje cez composer do /vendor zložky a má úplne jednoduché API. Ten extension by mal v podstate len vytvoriť inštanciu Sendgridu, ktorá berie ako parameter údaje meno a klúč.

Vytvoril som si teda extension:

<?php

<?php
namespace App\Extensions;
use Nette\DI\CompilerExtension;

class SendgridExtension extends CompilerExtension {


    public function loadConfiguration() {

        $builder = $this->getContainerBuilder();

        $config = $this->getConfig( );

        if (! $config ) {
            throw new \Exception('Please add configuration for Sendgrid, or remove it from active extensions' );
        }

        $builder->addDefinition($this->prefix('sendgrid'))
            ->setClass('App\Extensions\SendgridMailer', array( $config[ 'apiUser' ], $config[ 'apiKey' ] ) );
    }
}
?>

a do config neon pridal do extensions sekcie sendgrid: App\Extensions\SendgridExtension + v configu som zadefinoval

sendgrid:
apiUser: user
apiKey: key

Ďalej som vytvoril triedu SendgridMailer

<?php
namespace App\Extensions;
class SendgridMailer extends \Nette\Object {

    private $sendGrid;

    public function __construct( $apiUser, $apiKey ) {
        $this->sendGrid = new \SendGrid( $apiUser, $apiKey );
    }

    public function getMail() {
        return $this->sendGrid;
    }
}
?>

Chcem dosiahnuť toho aby v ideálnom prípade som mohol kdekolvek v presenteri zavolat niečo ako SendgridMailer::getMail() alebo SendgridMailer->getMail() a pracoval už s tým. Teda že by sa mi ten extension nakompiloval tak, že by si vytiahol údaje (user, key) z config.neon za kompilácie a ja aby som to nemusel neustále vyplňovať. Absolútne ale nechápem ako..

castamir
Člen | 629
+
+1
-

Compiler extension:

<?php

namespace App\Extensions;

use Nette\DI\CompilerExtension;

class SendgridExtension extends CompilerExtension
{

	public $defaults = [
		'apiUser' => 'default value for apiUser',
		'apiKey' => 'default value for apiKey',
	];

	public function loadConfiguration()
	{
		$builder = $this->getContainerBuilder();
		$config = $this->getConfig($this->defaults);
		$builder->addDefinition($this->prefix('sendgrid'))
			->setClass('App\Extensions\SendgridMailer', [$config['apiUser'], $config['apiKey']]);
	}

}

config.neon:

extensions:
	SendGrid: App\Extensions\SendgridExtension

SendGrid:
	apiUser: foo
	apiKey: bar

použití v presenteru:

<?php
namespace MyApplication;

class MyPresenter extends \Nette\Application\UI\Presenter
{
    /** @var \App\Extensions\SendgridMailer @inject */
    public $sendGridMailer;

    public function actionDefault()
    {
		$mail = $this->sendGridMailer->getMail();
    }

}

psáno zpatra, snad tam nejsou překlepy

castamir
Člen | 629
+
+1
-

Jen doplním, že řešení se může lehce lišit pro různé verze PHP (zkrácený zápis polí, nahrazení ‚App\Extensions\SendgridMailer‘ za SendgridMailer::class) a pro různé verze Nette (anotace @inject vs metody inject* nebo např. načítání extension v konfigu nebo v bootstrapu)

xrep
Člen | 51
+
0
-

to použitie v presenteri :) ďakujem! už to beží ako má