phpsymfonystofdoctrineextensionsapplication-structure

where to write custom functions and how to import them?


here is my little story: I am using DoctrinExtensions Tree on my entity account. The user can edit the tree in the UI and then save it. I send back back to the PHP an array of all the accounts. Then I want to rebuilt it as a tree and save/edit the accounts with the methods of the extension.

So I want to compare the UI returned array with my original tree from the db. I get the data by doing something like this:

$repo = $em->getRepository('NRtworksChartOfAccountsBundle:Accounttree');
$arrayTree = $repo->findAll(); 

So I have my tree in an array. What I want now is to find an object within this array by itsd ID. I know how to write the function, but in the MVC I don't know what's the right place to write it and call it from, nor if it's the correct way.

I tried to create a folder "Model" and a file Functions.php like this:

 namespace NRtworks\ChartOfAccountsBundle\Model;

 function get_account_from_id($array)
 {
    return "true";    
 }

and then call it from my controller

use NRtworks\ChartOfAccountsBundle\Model\Functions;
get_account_from_id($arrayTree);

But that doesn't work. Please advise on how I should do this and if there is a more correct way in the scope of the MVC idea.

thanks


Solution

  • You should write custom service and put logic inside. Doc: http://symfony.com/doc/current/book/service_container.html#what-is-a-service

    UPDATE (Code example):

    Les's configure service in the Container:

    # app/config/config.yml
    services:
        your_service:
            class:        NRtworks\ChartOfAccountsBundle\Service\YourService
    

    Now, your service class:

    namespace NRtworks\ChartOfAccountsBundle\Service;
    
    class YourService {
        public function getAccountFromId(array $array)
        {
            return "true";
        }
    }
    

    Now you could get this service from container like:

    class SomeController extends Controller {
        public function someMethod() {
            $yourService = $this->get('your_service');
        }
    }
    

    You can even inject your repository class to this service, like:

    # app/config/config.yml
    services:
        app.accounTtree.repository:
            class:           Doctrine\ORM\EntityRepository
            factory-service: doctrine.orm.entity_manager
            factory-method:  getRepository
            arguments: 
                - "App\MainBundle\Entity\Gallery"
    
        your_service:
            class:        NRtworks\ChartOfAccountsBundle\Service\YourService
            calls: 
                - [ setRepository, ["@app.accounTtree.repository"]]
    

    and just modify your service:

    namespace NRtworks\ChartOfAccountsBundle\Service;
    
    class YourService {
        protected $repository;
    
        public class setRepository($repository) {
            $this->repository = $repository;
        }
    
        public function getAccountFromId(array $array)
        {
            return "true";
        }
    }