Angel
Angel

Reputation: 1980

Symfony 2 Controller Action no return Response

I have been some time without programing in Synfony and I have some doubts.

Is posible that and Action Controller return a variable (for example and integer) instead of a Response Object or Json Object.

What I need is call a function inside another function in a different Controller. If the 2 functions live in the same Controller it has no problem (like this):

class AController{
  public function AAction(){
    $var = $this->BAction(); //Do whatever I want with $var
    return Response ("Hello");
  }

  public function BAction(){
    return 34; //return an integer instead of a Response
  }
 }

THE PROBLEM IS when the BAction is in another Controller. If I use a forward, Symfony expect that BAction return a Response object or a Json array, but I only want to return a simple variale.

Is this posible?? Return a simple integer...

Thanks a lot!!

Upvotes: 0

Views: 1938

Answers (2)

dariusphp
dariusphp

Reputation: 93

A controller should never use another controllers action. Thats not the problem that Controllers solve. Symfony business logic structure is SOA based. (https://en.wikipedia.org/wiki/Service-oriented_architecture) Therefore for custom business logic you should always use either:

Services: http://symfony.com/doc/current/book/service_container.html

Events: http://symfony.com/doc/current/components/event_dispatcher/introduction.html

Upvotes: 0

Frank B
Frank B

Reputation: 3697

No a Action must return a Response Object. But if you have two controllers (that will say two different classes) then you could create a service.

app/config/config.yml

services:
    app.my_ownservice:
        class:        AppBundle\Services\OwnService
        arguments: 
            entityManager: "@doctrine.orm.entity_manager"

app/Services/OwnService.php

namespace AppBundle\Services;

use Doctrine\ORM\EntityManager;

class OwnService {

    /**
     *
     * @var EntityManager 
     */
    private $em;

    public function __constructor(EntityManager $entityManager)
    {
        $this->em = $entityManager;
    }

    public function doSomething(){
       // you could use the entitymanager here
       return 'Okay i will do something.';
    }

}

And from each controller (or whatever) you can do:

$myOwnService = $this->get('app.my_ownservice');
$text = $myOwnService->doSomething();
// echo $text;

Upvotes: 2

Related Questions