Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [SF][SF2][Symfony2] Command - przekazywanie danych strony do metody execute
Forum PHP.pl > Forum > PHP > Frameworki
damianooo
Mam klasę Command, którą będzie uruchamiał CRON na serwerze produkcyjnym.
W klasie Command mam metodę execute w której mam odpowiednie zadania do zrealizowania.
Jak przekazać do metody execute parametry z mojej aplikacji WWW ?
Wiem że metoda execute przyjmuje dwa parametry input i output - rozumiem że to z nich trzeba skorzystać tylko nie wiem za bardzo jak.

Przykładowo w aplikacji na głównej stronie mam wyświetlaną datę i jakieś ID/Numer - wartości obu parametrów będą się zmieniać.
I teraz chciałbym te parametry przekazać do metody klasy Command , która wykonuje zadania za pomocą CRONa.

Jak pobrać te dane (data,numer) ze strony i przekazać je jako parametry do metody execute klasy Command ?
A może nie tak to się robi ?
mcmaroon
Twoja klasa zamiast
  1. use Symfony\Component\Console\Command\Command;

może też dziedziczyć np
  1. use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand;

czyli
  1. class JakasNazwaCommand extends ContainerAwareCommand

i w tym momencie możesz w execute dać np taki zestaw który umożliwi Tobie pobranie danych z bazy lub konfiguracji yml
  1. $this->container = $this->getContainer();
  2. $this->doctrine = $this->container->get('doctrine');
  3. $this->em = $this->doctrine->getManager();
  4. $this->em->getConnection()->getConfiguration()->setSQLLogger(null);

przykładowo
  1. $this->container->getParameter('database_name');


Możesz też w metodzie configure użyć addArgument lub addOption i posyłać parametry bezpośrednio przez zadanie cron ale to raczej nie wchodzi w grę.
damianooo
ok .. widzę że moja klasa dziedziczy po ContainerAwareCommand:

  1. class CronCommand extends ContainerAwareCommand{


W projekcie mam tak że w bazowym pliku szablonu TWIG base.html.twig mam wywoływaną funkcję z szablonu Twig Extension, która wyciąga mi obecny numer kolejki (kolejka piłkarska).

AppExtension.php

  1. class AppExtension extends \Twig_Extension{
  2. ...
  3. public function getFunctions()
  4. {
  5. return array(
  6. new \Twig_SimpleFunction('curr_matchday', array($this, 'getCurrentMatchday')),
  7. ....
  8. }
  9.  
  10. // get current matchday
  11. public function getCurrentMatchday(){
  12. $repository = $this->doctrine->getRepository('AppBundle:Matchday');
  13. $matchday = $repository->getMatchday();
  14.  
  15. return $matchday;
  16. }


base.html.twig

  1. <div id="info_02">
  2. {% block info %}
  3. ...
  4. Kolejka {{ curr_matchday().name }}/15
  5. ...
  6. {% endblock %}
  7. </div>


Może jeszcze wrzucę jak wygląda metoda wywoływanej w TwigExtension metody klasy Repository:

  1. class MatchdayRepository extends EntityRepository
  2. {
  3. // pobranie obecnej kolejki
  4. public function getMatchday(){
  5. $today = new \DateTime('now');
  6. $qb = $this->createQueryBuilder('m');
  7. $qb->select('m.id AS id'
  8. ,'m.name AS name'
  9. ,'m.dateFrom AS dateFrom'
  10. ,'m.dateTo AS dateTo'
  11. ,'s.id AS season_id'
  12. )
  13. ->innerJoin('m.season', 's')
  14. ->where('m.dateFrom > :today')
  15. ->setMaxResults(1)
  16. ->setParameter('today', $today->format('Y-m-d H:i:s'))
  17. ;
  18.  
  19. $result = $qb->getQuery()->getOneOrNullResult();
  20.  
  21. return $result;
  22. }
  23.  
  24. }



I jak teraz przekazać z szablonu bazowego TWIG tą wartość curr_matchday().name jako parametr do mojej metody execute w klasie Command ?
mcmaroon
Pobrać tak samo jak w twig extension
czyli np to co pisałem poprzednio
  1. $this->container = $this->getContainer();
  2. $this->doctrine = $this->container->get('doctrine');
  3. $this->em = $this->doctrine->getManager();
  4. $this->em->getConnection()->getConfiguration()->setSQLLogger(null);

+ w execute
  1. $repository = $this->em->getRepository('AppBundle:Matchday');
  2. $matchday = $repository->getMatchday();
  3. if(matchday){
  4. // tu jakis kod
  5. }
damianooo
ok dzięki no fakt działa!
Zrobiłem tak:

  1. class CronCommand extends ContainerAwareCommand{
  2.  
  3. ...
  4.  
  5. protected function execute(InputInterface $input, OutputInterface $output)
  6. {
  7. $doctrine = $this->getContainer()->get('doctrine');
  8. $em = $doctrine->getEntityManager();
  9.  
  10. $matchdayObject = $em->getRepository('AppBundle:Matchday')->getMatchday();
  11. $usersPhones = $em->getRepository('AppBundle:Type')->getNoTypedUsersList($matchdayObject['name']);
  12. ...
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2024 Invision Power Services, Inc.