Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [Symfony][SF2] Command Console
Michal_Sz
post
Post #1





Grupa: Zarejestrowani
Postów: 76
Pomógł: 0
Dołączył: 9.10.2007

Ostrzeżenie: (0%)
-----


Witam,

Chciałbym wywołać w konsoli akcję, a później wrzucić ją do cronów.

Znalazłem prosty przykład jak wyświetlić coś w konsoli czyli:
  1. namespace Cron\CronBundle\Command;
  2.  
  3. use Symfony\Component\Console\Command\Command;
  4. use Symfony\Component\Console\Input\InputArgument;
  5. use Symfony\Component\Console\Input\InputInterface;
  6. use Symfony\Component\Console\Input\InputOption;
  7. use Symfony\Component\Console\Output\OutputInterface;
  8.  
  9. class GreetCommand extends Command
  10. {
  11. protected function configure()
  12. {
  13. $this
  14. ->setName('phax:action')
  15. ->setDescription('Execute Phax action using command line')
  16. ->addArgument('controller', InputArgument::OPTIONAL, 'Controller name', 'help')
  17. ->addArgument('action', InputArgument::OPTIONAL, 'Action name', 'default')
  18. ->addOption(
  19. 'parameters',
  20. 'p',
  21. InputOption::VALUE_OPTIONAL | InputOption::VALUE_IS_ARRAY,
  22. 'Parameters to send to the controller'
  23. )
  24. ;
  25. }
  26.  
  27. protected function execute(InputInterface $input, OutputInterface $output)
  28. {
  29. $name = $input->getArgument('name');
  30. if ($name) {
  31. $text = 'Hellosa '.$name;
  32. } else {
  33. $text = 'Helloaaa';
  34. }
  35.  
  36. if ($input->getOption('yell')) {
  37. $text = strtoupper($text);
  38. }
  39.  
  40. $output->writeln($text);
  41. }
  42. }


  1. #!/usr/bin/env php
  2. <?php
  3. // application.php
  4.  
  5. require __DIR__.'/vendor/autoload.php';
  6.  
  7. use Cron\CronBundle\Command\GreetCommand;
  8. use Symfony\Component\Console\Application;
  9.  
  10.  
  11. $application = new Application();
  12. $application->add(new GreetCommand());
  13. $application->run();


  1. $ php application.php demo:greet Fabien


Ale teraz nie wiem jak zrobić aby wywołać np. akcję z Cron\CronBundle\Controller\DefaultController->indexAction()

Prosiłbym o jakąś pomoc i wskazówki
Go to the top of the page
+Quote Post
2 Stron V   1 2 >  
Start new topic
Odpowiedzi (1 - 31)
Damonsson
post
Post #2





Grupa: Zarejestrowani
Postów: 2 355
Pomógł: 533
Dołączył: 15.01.2010
Skąd: Bydgoszcz

Ostrzeżenie: (0%)
-----


Hmm skoro chcesz robić coś takiego, to na kontroler mi Twoja klasa (Controller\DefaultController) nie wygląda, prędzej jakiś serwis. A jak utworzyć serwis i się do niego odwołać gdziekolwiek w Symfony2 masz ładne opisy w dokumentacji.

Ten post edytował Damonsson 1.07.2015, 15:31:56
Go to the top of the page
+Quote Post
Michal_Sz
post
Post #3





Grupa: Zarejestrowani
Postów: 76
Pomógł: 0
Dołączył: 9.10.2007

Ostrzeżenie: (0%)
-----


Dzięki za radę. Stworzyłem service ale kiedy próbuje się odwołać do niego w EXECUTE w taki sposób:
  1. $this->container = $this->getApplication()->getKernel()->getContainer();
  2. $c1m = $this->container->get('cron_1m');

lub w taki sposób:
  1. $this->getContainer()->get('cron_1m');


dostaję komunikat:
  1. Call to undefined
  2. method Symfony\Component\Console\Application::getKernel() in /home/httpd/virtual/nowepaliwa/src/Cron/Cron1mBundle/Command/TestCommand.php on line 36

lub
  1. PHP Fatal error: Call to undefined method Cron\Cron1mBundle\Command\TestCommand::getContainer() in /home/httpd/virtual/nowepaliwa/src/Cron/Cron1mBundle/Command/TestCommand.php on line 34
  2.  


czy coś pominąłem lub co zrobiłem nie tak?
Go to the top of the page
+Quote Post
Damonsson
post
Post #4





Grupa: Zarejestrowani
Postów: 2 355
Pomógł: 533
Dołączył: 15.01.2010
Skąd: Bydgoszcz

Ostrzeżenie: (0%)
-----


A rozszerzasz klasę ContainerAwareCommand, zamiast Command?
Go to the top of the page
+Quote Post
Michal_Sz
post
Post #5





Grupa: Zarejestrowani
Postów: 76
Pomógł: 0
Dołączył: 9.10.2007

Ostrzeżenie: (0%)
-----


Tak,próbowałem obu rozszerzeń.
Teraz wygląda totak:
  1. <?php
  2.  
  3. namespace Cron\Cron1mBundle\Command;
  4. use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand;
  5. use Symfony\Component\Console\Input\InputArgument;
  6. use Symfony\Component\Console\Input\InputInterface;
  7. use Symfony\Component\Console\Input\InputOption;
  8. use Symfony\Component\Console\Output\OutputInterface;
  9.  
  10. class TestCommand extends ContainerAwareCommand
  11. {
  12. protected function configure()
  13. {
  14. $this
  15. ->setName('phax:action')
  16. ->setDescription('Execute Phax action using command line')
  17.  
  18. ;
  19. }
  20.  
  21. protected function execute(InputInterface $input, OutputInterface $output)
  22. {
  23.  
  24. $c1m = $this->container->get('cron_1m');
  25. $txt = $c1m->indexAction();
  26. $output->writeln($txt );
  27. }
  28.  
  29. }




  1. require __DIR__.'/vendor/autoload.php';
  2.  
  3. use Cron\Cron1mBundle\Command\TestCommand;
  4. //use Cron\CronBundle\Command\GreetCommand;
  5. use Symfony\Component\Console\Application;
  6.  
  7.  
  8. $application = new Application();
  9. $application->add(new TestCommand());
  10. $application->run();


i wywołanie:

  1. ~$ php application_1m.php phax:action
Go to the top of the page
+Quote Post
Damonsson
post
Post #6





Grupa: Zarejestrowani
Postów: 2 355
Pomógł: 533
Dołączył: 15.01.2010
Skąd: Bydgoszcz

Ostrzeżenie: (0%)
-----


Zainwestuj w jakieś porządne IDE np. PHPStorm, to od razu dostaniesz info, że container jest private i musisz się dobrać przez getter.

czyli u Ciebie powinno to wyglądać tak:

  1. $c1m = $this->getContainer()->get('cron_1m');
Go to the top of the page
+Quote Post
Michal_Sz
post
Post #7





Grupa: Zarejestrowani
Postów: 76
Pomógł: 0
Dołączył: 9.10.2007

Ostrzeżenie: (0%)
-----


Przepraszam nie to skopiowałem, oczywiście jest tak:

  1. $this->getContainer()->get('cron_1m');


Błąd ciągle pozostał.
Go to the top of the page
+Quote Post
Damonsson
post
Post #8





Grupa: Zarejestrowani
Postów: 2 355
Pomógł: 533
Dołączył: 15.01.2010
Skąd: Bydgoszcz

Ostrzeżenie: (0%)
-----


ee niemożliwe, a treść błędu?
Go to the top of the page
+Quote Post
Michal_Sz
post
Post #9





Grupa: Zarejestrowani
Postów: 76
Pomógł: 0
Dołączył: 9.10.2007

Ostrzeżenie: (0%)
-----


  1. PHP Fatal error: Call to undefined method Symfony\Component\Console\Application::getKernel() in /home/httpd/virtual/nowepaliwa/vendor/symfony/symfony/src/Symfony/Bundle/FrameworkBundle/Command/ContainerAwareCommand.php on line 43
Go to the top of the page
+Quote Post
Damonsson
post
Post #10





Grupa: Zarejestrowani
Postów: 2 355
Pomógł: 533
Dołączył: 15.01.2010
Skąd: Bydgoszcz

Ostrzeżenie: (0%)
-----


i jeszcze jakbyś był łaskaw pokazać tę 143 linię

jeżeli masz tam coś takiego:

  1. $this->container = $this->getApplication()->getKernel()->getContainer();


to wywal to.
Go to the top of the page
+Quote Post
Michal_Sz
post
Post #11





Grupa: Zarejestrowani
Postów: 76
Pomógł: 0
Dołączył: 9.10.2007

Ostrzeżenie: (0%)
-----


ale to wskazuje na plik którym rozszerzam czyli ContainerAwareCommand z tej ścieżki: /vendor/symfony/symfony/src/Symfony/Bundle/FrameworkBundle/Command/ContainerAwareCommand.php

  1. namespace Symfony\Bundle\FrameworkBundle\Command;
  2.  
  3. use Symfony\Component\Console\Command\Command;
  4. use Symfony\Component\DependencyInjection\ContainerInterface;
  5. use Symfony\Component\DependencyInjection\ContainerAwareInterface;
  6.  
  7. /**
  8.  * Command.
  9.  *
  10.  * @author Fabien Potencier <fabien@symfony.com>
  11.  */
  12. abstract class ContainerAwareCommand extends Command implements ContainerAwareInterface
  13. {
  14. /**
  15.   * @var ContainerInterface|null
  16.   */
  17. private $container;
  18.  
  19. /**
  20.   * @return ContainerInterface
  21.   *
  22.   * @throws \LogicException
  23.   */
  24. protected function getContainer()
  25. {
  26. if (null === $this->container) {
  27. $application = $this->getApplication();
  28. if (null === $application) {
  29. throw new \LogicException('The container cannot be retrieved as the application instance is not yet set.');
  30. }
  31.  
  32. $this->container = $application->getKernel()->getContainer();
  33. }
  34.  
  35. return $this->container;
  36. }
  37.  
  38. /**
  39.   * {@inheritdoc}
  40.   */
  41. public function setContainer(ContainerInterface $container = null)
  42. {
  43. $this->container = $container;
  44. }
  45. }


jak to wywalam to jest fatal error

Ten post edytował Michal_Sz 1.07.2015, 21:57:05
Go to the top of the page
+Quote Post
Damonsson
post
Post #12





Grupa: Zarejestrowani
Postów: 2 355
Pomógł: 533
Dołączył: 15.01.2010
Skąd: Bydgoszcz

Ostrzeżenie: (0%)
-----


Aaa dobra moje niedopatrzenie nic nie usuwaj, zasugerowałem się poprzednim postem, w którym miałeś taką konstrukcję.

W app/console Zamień

  1. use Symfony\Component\Console\Application;


na

  1. use Symfony\Bundle\FrameworkBundle\Console\Application;
Go to the top of the page
+Quote Post
Michal_Sz
post
Post #13





Grupa: Zarejestrowani
Postów: 76
Pomógł: 0
Dołączył: 9.10.2007

Ostrzeżenie: (0%)
-----


Zmieniłem i pojawiło sie jeszcze coś gorszego:
  1. PHP Catchable fatal error: Argument 1 passed to Symfony\Bundle\FrameworkBundle\Console\Application::__construct() must be an instance of Symfony\Component\HttpKernel\KernelInterface, none given, called in /home/httpd/virtual/nowepaliwa/application_1m.php on line 13 and defined in /home/httpd/virtual/nowepaliwa/vendor/symfony/symfony/src/Symfony/Bundle/FrameworkBundle/Console/Application.php on line 38
Go to the top of the page
+Quote Post
Damonsson
post
Post #14





Grupa: Zarejestrowani
Postów: 2 355
Pomógł: 533
Dołączył: 15.01.2010
Skąd: Bydgoszcz

Ostrzeżenie: (0%)
-----


Spokojnie, jest lepiej (IMG:style_emoticons/default/smile.gif)

Hmm skąd wziąłeś ten plik app/console? To jakiś wymóg jakiegoś bundle?

Teoretycznie tak powinien wyglądać i wtedy wszystko powinno działać: https://github.com/symfony/symfony-demo/blo...ter/app/console

Ten post edytował Damonsson 1.07.2015, 22:18:17
Go to the top of the page
+Quote Post
Michal_Sz
post
Post #15





Grupa: Zarejestrowani
Postów: 76
Pomógł: 0
Dołączył: 9.10.2007

Ostrzeżenie: (0%)
-----


u mnie to wygląda tak:

  1. <?php
  2.  
  3. // application.php
  4.  
  5. require __DIR__.'/vendor/autoload.php';
  6.  
  7. use Cron\Cron1mBundle\Command\TestCommand;
  8.  
  9. use Symfony\Bundle\FrameworkBundle\Console\Application;
  10.  
  11.  
  12. $application = new Application();
  13. $application->add(new TestCommand());
  14. $application->run();


gdzieś w Internecie znalazłem taki przykłąd

Ten post edytował Michal_Sz 1.07.2015, 22:20:51
Go to the top of the page
+Quote Post
Damonsson
post
Post #16





Grupa: Zarejestrowani
Postów: 2 355
Pomógł: 533
Dołączył: 15.01.2010
Skąd: Bydgoszcz

Ostrzeżenie: (0%)
-----


Ok, ale pytanie za sto punktów czemu tak wygląda? Sam go napisałeś? Zamień go na ten który Ci podałem na github, jak nic nie wybuchnie i będzie wszystko działać to ok. A jak coś przestanie działać to będzie większy problem niestety.
Go to the top of the page
+Quote Post
Michal_Sz
post
Post #17





Grupa: Zarejestrowani
Postów: 76
Pomógł: 0
Dołączył: 9.10.2007

Ostrzeżenie: (0%)
-----


Namieszałem, plik o którym mówisz wygląda dokłądnie tak jak podałeś, to co CI wysłąłem to plik który wywołuje w konsoli.
Plik: appliaction.php:
  1. <?php
  2.  
  3. // application+1m.php
  4.  
  5. require __DIR__.'/vendor/autoload.php';
  6.  
  7. use Cron\Cron1mBundle\Command\TestCommand;
  8.  
  9. use Symfony\Component\Console\Application;
  10.  
  11.  
  12. $application = new Application();
  13. $application->add(new TestCommand());
  14. $application->run();


iw konsoli wywołuje:
  1. php application_1m.php phax:action
Go to the top of the page
+Quote Post
Damonsson
post
Post #18





Grupa: Zarejestrowani
Postów: 2 355
Pomógł: 533
Dołączył: 15.01.2010
Skąd: Bydgoszcz

Ostrzeżenie: (0%)
-----


Wiesz co, prościej będzie jak wywalisz wszystko, zainstalujesz po bożemu symfony i po bożemu wg dokumentacji dodasz komendę i serwis (IMG:style_emoticons/default/biggrin.gif) To jest naprawdę banalne i trwa 2 minuty, a te wymyślane pliki typu application_1m.php tylko wszystko pieprzą.

Ale spróbujmy to odratować.

A co się stanie jak wywołasz:
  1. php app/console phax:action

lub
  1. php app/console
Go to the top of the page
+Quote Post
Michal_Sz
post
Post #19





Grupa: Zarejestrowani
Postów: 76
Pomógł: 0
Dołączył: 9.10.2007

Ostrzeżenie: (0%)
-----


Powiem Ci, ze przepisywanie wszystkiego na nowo to byłaby masakra, ale Twoje rozwiązanie pomogło i mogę to wywołać, a przynajmniej się nie wysypuje. Muszę dokońćzyć funkcję, żeby coś wyciagać z indexAction i wtedy będę pewny czy jest ok bo na tą chwilę zwraca mi:
  1. PHP Fatal error: Call to a member function get() on a non-object in /home/httpd/virtual/nowepaliwa/vendor/symfony/symfony/src/Symfony/Bundle/FrameworkBundle/Controller/Controller.php on line 108


NIe bardzo jednak rozumiem dlaczego akurat phax:action wywołuje a np. jeśli w innym pliku jest phax:action1 to już nie

Ten post edytował Michal_Sz 1.07.2015, 22:51:53
Go to the top of the page
+Quote Post
Damonsson
post
Post #20





Grupa: Zarejestrowani
Postów: 2 355
Pomógł: 533
Dołączył: 15.01.2010
Skąd: Bydgoszcz

Ostrzeżenie: (0%)
-----


Ok czyli
  1. php app/console phax:action

działa poprawnie?

Teoretycznie dla swojego pliku application_1m.php mógłbyś stworzyć taką samą strukturę jak jest w app/console i ją wywoływać, ale że musisz przekazać AppKernel, skoro chcesz się odwołać do serwisu to nie miałoby żadnego sensu bo i tak miałbyś wszystkie komendy z symfony.

Cytat(Michal_Sz @ 1.07.2015, 23:44:19 ) *
NIe bardzo jednak rozumiem dlaczego akurat phax:action wywołuje a np. jeśli w innym pliku jest phax:action1 to już nie

To znaczy? phax:action tak nazwałeś swoją komendę, jak chcesz móc wywołać phax:action1, to musisz taką stworzyć.

Ten post edytował Damonsson 1.07.2015, 22:56:43
Go to the top of the page
+Quote Post
Michal_Sz
post
Post #21





Grupa: Zarejestrowani
Postów: 76
Pomógł: 0
Dołączył: 9.10.2007

Ostrzeżenie: (0%)
-----


  1. php app/console phax:action
działa poprawnie, tylko nadal nie rozumiem jednego.
Sworzyłem plik w takiej ścieżce:
  1. src\Cron\Cron1mBundle\Command\TestCommand.php
gdzie faktycznie jest komenda
  1. phax:action
- i ją wywołuje tak jak wyżej

Stworzyłem plik w takiej ścieżce:
  1. src\Cron\Cron1mBundle\Command\TestCommand1.php
gdzie jest komenda
  1. phax:action1
- i już tego nie mogę wywołać w ten sposób
  1. php app/console phax:action1
- bo jest błąd że komenda nie istnieje.

Szczerze mówiąc nie kojarzę żebym coś jeszcze robił aby wywołać:
  1. phax:action
Go to the top of the page
+Quote Post
prz3kus
post
Post #22





Grupa: Zarejestrowani
Postów: 260
Pomógł: 30
Dołączył: 22.01.2007

Ostrzeżenie: (0%)
-----


Bez błędów i kodu nie ma odpowiedzi, szklana kula gdzieś zagineła (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
Michal_Sz
post
Post #23





Grupa: Zarejestrowani
Postów: 76
Pomógł: 0
Dołączył: 9.10.2007

Ostrzeżenie: (0%)
-----


Błąd pojawia się taki:
  1. [InvalidArgumentException]
  2. Command "phax:action1" is not defined.
  3. Did you mean this?
  4. phax:action

Gdzie należy zdefiniować komendę?
Go to the top of the page
+Quote Post
prz3kus
post
Post #24





Grupa: Zarejestrowani
Postów: 260
Pomógł: 30
Dołączył: 22.01.2007

Ostrzeżenie: (0%)
-----


wklej cale źródło pliku src\Cron\Cron1mBundle\Command\TestCommand1.php

Ten post edytował prz3kus 2.07.2015, 07:19:27
Go to the top of the page
+Quote Post
Michal_Sz
post
Post #25





Grupa: Zarejestrowani
Postów: 76
Pomógł: 0
Dołączył: 9.10.2007

Ostrzeżenie: (0%)
-----


  1. namespace Cron\Cron1mBundle\Command;
  2.  
  3.  
  4. use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand;
  5. use Symfony\Component\Console\Input\InputArgument;
  6. use Symfony\Component\Console\Input\InputInterface;
  7. use Symfony\Component\Console\Input\InputOption;
  8. use Symfony\Component\Console\Output\OutputInterface;
  9.  
  10. class TestCommand1 extends ContainerAwareCommand
  11. {
  12. protected function configure()
  13. {
  14. $this
  15. ->setName('phax:action1')
  16. ->setDescription('Execute Phax action using command line')
  17.  
  18. ;
  19. }
  20.  
  21. protected function execute(InputInterface $input, OutputInterface $output)
  22. {
  23.  
  24. $c1m = $this->getContainer()->get('cron_1m');
  25. $output->writeln('$texst');
  26. }
  27.  
  28. }


Ten post edytował Michal_Sz 2.07.2015, 07:25:18
Go to the top of the page
+Quote Post
prz3kus
post
Post #26





Grupa: Zarejestrowani
Postów: 260
Pomógł: 30
Dołączył: 22.01.2007

Ostrzeżenie: (0%)
-----


no to jeszcze wklej metode action1 z kontrolera phax

Pozatym pytanie czy czsami nie prościej sobie wywołac jakieś zapytanie czy cuś (IMG:style_emoticons/default/smile.gif) odrazu w tej klasie

Tutaj jedno z moich zadań robiące update do bazy

  1. class StatusCommand extends ContainerAwareCommand
  2. {
  3. protected function configure()
  4. {
  5. $this
  6. ->setName('statusupdate')
  7. ->setDescription('Aktualizacja statusów')
  8. ;
  9. }
  10.  
  11. protected function execute(InputInterface $input, OutputInterface $output)
  12. {
  13. $em = $this->getContainer()->get('doctrine.orm.entity_manager');
  14.  
  15. $today = new \DateTime("now");
  16. $repository = $em->getRepository('OFPortalBundle:Offer');
  17.  
  18. $query = $repository->createQueryBuilder('o')
  19. ->update()
  20. ->set('o.status',3)
  21. ->where('o.expirationDateTime < :today and o.status < 3')
  22. ->setParameter('today', $today)
  23. ->getQuery()
  24. ->getResult();
  25.  
  26. $output->writeln('ok');
  27. }
  28. }

Go to the top of the page
+Quote Post
Michal_Sz
post
Post #27





Grupa: Zarejestrowani
Postów: 76
Pomógł: 0
Dołączył: 9.10.2007

Ostrzeżenie: (0%)
-----


Ta metoda action1 okazuje się, że nie ma znaczenia, bo czy ona jest czy nie ma błąd jest ten sam.
Właściwie to był bo dorzuciłem do app/config/config.yml:
  1. services:
  2. app.command.my_command:
  3. class: Cron\Cron1mBundle\Command\TestCommand1
  4. arguments: ["%command.default_name%"]
  5. tags:
  6. - { name: console.command }

i teraz widzi mi komendę:
  1. phax:action1

z konsoli już to mogę uruchomić, ale nie rozumiem jednej rzeczy, bo wcześniej nie rejestrowałem w configu komendy
  1. phax:action
a mimo to działa
Go to the top of the page
+Quote Post
Damonsson
post
Post #28





Grupa: Zarejestrowani
Postów: 2 355
Pomógł: 533
Dołączył: 15.01.2010
Skąd: Bydgoszcz

Ostrzeżenie: (0%)
-----


Bo dodałeś 1 na końcu, zrób komendę Test1Command to nic nie będziesz musiał dodawać. Zamiast marnować czas na forum przez ten czas przeczytałbyś tę dokumentację Symfony w końcu, tam jest WSZYSTKO o co pytasz.

Cytat(prz3kus @ 2.07.2015, 08:54:07 ) *
Pozatym pytanie czy czsami nie prościej sobie wywołac jakieś zapytanie czy cuś (IMG:style_emoticons/default/smile.gif) odrazu w tej klasie

Tutaj jedno z moich zadań robiące update do bazy

  1. class StatusCommand extends ContainerAwareCommand
  2. {
  3. protected function configure()
  4. {
  5. $this
  6. ->setName('statusupdate')
  7. ->setDescription('Aktualizacja statusów')
  8. ;
  9. }
  10.  
  11. protected function execute(InputInterface $input, OutputInterface $output)
  12. {
  13. $em = $this->getContainer()->get('doctrine.orm.entity_manager');
  14.  
  15. $today = new \DateTime("now");
  16. $repository = $em->getRepository('OFPortalBundle:Offer');
  17.  
  18. $query = $repository->createQueryBuilder('o')
  19. ->update()
  20. ->set('o.status',3)
  21. ->where('o.expirationDateTime < :today and o.status < 3')
  22. ->setParameter('today', $today)
  23. ->getQuery()
  24. ->getResult();
  25.  
  26. $output->writeln('ok');
  27. }
  28. }

A tak broń Boże się nie ucz pisać, bo nie ma to nic wspólnego z OOP, nie mówiąc o napisaniu do tego testów.

Ten post edytował Damonsson 2.07.2015, 09:38:54
Go to the top of the page
+Quote Post
Michal_Sz
post
Post #29





Grupa: Zarejestrowani
Postów: 76
Pomógł: 0
Dołączył: 9.10.2007

Ostrzeżenie: (0%)
-----


Dokumentację czytam, ale bywa tak że najprostsze rzeczy bardzo się komplikują.
Dzięki za pomoc.
Go to the top of the page
+Quote Post
aras785
post
Post #30





Grupa: Zarejestrowani
Postów: 859
Pomógł: 177
Dołączył: 29.10.2009

Ostrzeżenie: (0%)
-----


Cytat(Damonsson @ 2.07.2015, 10:36:46 ) *
Zamiast marnować czas na forum przez ten czas przeczytałbyś tę dokumentację Symfony w końcu, tam jest WSZYSTKO o co pytasz.


Idąc Twoim tokiem myślenia to nie powinno być for dyskusyjnych bo przecież do każdego języka/frameworka jest dokumentacja, a jak nie to przecież można kod źródłowy przeanalizować... (IMG:style_emoticons/default/facepalmxd.gif)
Go to the top of the page
+Quote Post
Damonsson
post
Post #31





Grupa: Zarejestrowani
Postów: 2 355
Pomógł: 533
Dołączył: 15.01.2010
Skąd: Bydgoszcz

Ostrzeżenie: (0%)
-----


@aras785 Weź wyjdź przeczytaj jakąś netykietę, poradnik jak zadawać pytania, poczytaj o akronimie RTFM i skąd się wziął, wróć i przeproś.

Chętnie pomagam każdej osobie na forum, a sugestia zajrzenia do dokumentacji to też pomoc, bo po co ma czekać, aż ja za niego przeczytam dokumentację, przetłumaczę i opiszę co jest w niej napisane?
Go to the top of the page
+Quote Post
Michal_Sz
post
Post #32





Grupa: Zarejestrowani
Postów: 76
Pomógł: 0
Dołączył: 9.10.2007

Ostrzeżenie: (0%)
-----


witam ponownie,

Pojawił sie u mnie jeszcze jeden problem dotyczący wywoływania akcji z poziomu konsoli.
Udaje mi się wywoływać proste akcje z poziomu konsoli.
Opisuje po kolei bo może coś pominąłem.
Posiadam kontroler:
  1. class DefaultController extends Controller
  2. {
  3. public function indexAction($em_mysql)
  4. {
  5. $cronlogs = new Cronlogs();
  6. $cronlogs->setCreateDate(new \DateTime("now"));
  7. $cronlogs->setCronId('1M');
  8. $cronlogs->setName('minutowy ogolny');
  9.  
  10. $em_mysql->persist($cronlogs);
  11. $em_mysql->flush();
  12.  
  13. $cron = 'CRON 1 M ';
  14. return new Response($cron);
  15. }
  16. }


Stworzyłem serwis, aby odwływać się do tej akcji i wygląda to tak:
  1.  
  2. class Cron1mCommand extends ContainerAwareCommand
  3. {
  4. protected function configure()
  5. {
  6. $this
  7. ->setName('phax:cron1m')
  8. ->setDescription('Cron minutowy');
  9. }
  10.  
  11. protected function execute(InputInterface $input, OutputInterface $output)
  12. {
  13.  
  14. $c1m = $this->getContainer()->get('cron_1m');
  15. $entityManager = $this->getContainer()->get('doctrine')->getManager('default');
  16.  
  17. $txt = $c1m->indexAction($entityManager);
  18. $output->writeln($txt);
  19. }
  20. }


Kiedy w konsoli odwołuje się do tego poprzez:

  1. php app/console phax:cron1m


to jest OK, ale dlatego, że do indexAction przekazuje:
  1. $entityManager = $this->getContainer()->get('doctrine')->getManager('default');


Jeśli natomiast nie przekazywałbym tego do akcji, ale wywoływał to w samej akcji czyli:


  1. class DefaultController extends Controller
  2. {
  3. public function indexAction()
  4. {
  5. $cronlogs = new Cronlogs();
  6. $cronlogs->setCreateDate(new \DateTime("now"));
  7. $cronlogs->setCronId('1M');
  8. $cronlogs->setName('minutowy ogolny');
  9. [b]$em_mysql= $this->getContainer()->get('doctrine')->getManager('default');[/b]
  10. $em_mysql->persist($cronlogs);
  11. $em_mysql->flush();
  12.  
  13. $cron = 'CRON 1 M ';
  14. return new Response($cron);
  15. }
  16. }


to wtedy dostaję błąd:

  1. Call to a member function get() on a non-object in /home/httpd/virtual/nowepaliwa/vendor/symfony/symfony/src/Symfony/Bundle/FrameworkBundle/Controller/Controller.php on line 275


Z czego to może wynikać?
Myślę, że takie rozwiązanie jest błędne, poza tym cokolwiek bym nie chciał wywołać w tej akcji, choćby serwis to musiałbym wszystko przekazywać do akcji.
Go to the top of the page
+Quote Post

2 Stron V   1 2 >
Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.08.2025 - 11:54