Викане на променливи в един контролер от друг... Symfony
Здравейте,
Опитвам се да си изнеса метод в друг контролер, който после да достъпвам през останалите контролери за извличане на данни. Този метод ще ми носи жизнено важната информация и наистина имам крещяща нужда от адекватно решение, вместо да правя нов метод във всеки контролер и при промяна да минавам навсякъде. Прочетох, че мога да си направя метода като контролер, но цаката не сполучва, тъй като вади променливите успешно, но ги вади празни, защото метода който трябва да ги напълни още не е извикан.
Ето следните три примерни файла:
BuildingsController.php
<?php
namespace Bundle\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
class BuildingsController extends Controller
{
private $UserData;
public function __construct()
{
$this->UserData = $this->get('user_controller');
}
/**
* @Route ("/buildings", name="buildings")
* @param Request $reuqest
* @return \Symfony\Component\HttpFoundation\Response
*/
public function buildings()
{
return $this->render('default/buildings.html.twig', [
'ver' => $this->UserData->ver,
'resources'=> $this->UserData->getResources,
'village' => $this->UserData->getVillage,
]);
}
}
Services.yml
# Learn more about services, parameters and containers at
# http://symfony.com/doc/current/service_container.html
parameters:
# parameter_name: value
services:
user_controller:
class: Bundle\Controller\UserController
Въпросния UserController.php който ще носи информация:
<?php
namespace Bundle\Controller;
use Bundle\Entity\GameResources;
use Bundle\Entity\Villages;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
class UserController extends Controller
{
public $ver;
public $getResources;
public $getVillage;
public function dataRepo(){
$this->ver = '1';
if(!($this->getUser()==null)) {
$this->getResources = $this->getDoctrine()->getRepository(GameResources::class)->findOneBy(['ofPlayer' => $this->getUser()->getId()]);
$this->getVillage = $this->getDoctrine()->getRepository(Villages::class)->findOneBy(['ownerPlayer' => $this->getUser()->getId()]);
}
return $this;
}
}
Това го правя по този начин защото не намерих друг в който да си пренасям такава информация извикана един път по различните темплейт, а twig-а явно не е чак толкова гъвкав в това отношение.
Предложения? (Държа да отбележа ,че не твърдя, че това е най-добрия начин)
Ето и един dump() на извикания обект по-горе:
BuildingsController.php on line 21:
UserController {#507 ▼
+ver: null
+getResources: null
+getVillage: null
#container: null
}
@b.yordanov - трябва да ти кажа, че този дебъг лог който ме посъветва да гледам е сигурно един от най-безполезните на този свят :D
Вероятно може, но не мога да си го представя как. Така ли трябва да станат нещата? http://symfony.com/doc/current/doctrine/repository.html
Няма примери в авторските решения и нещо не се получават както се очаква нещата...
Точно така, само че като се извика dataRepo() и ми вика Call to a member function has() on null
Ето как съм опитвал да го викна:
Като цяло, логиката да търсиш селата на играч през репото за села (Villages) ми се струва грешна.
Ако имаш Village който си има играч, то вероятно имаш и обратния mapping - играчът си има колекция от Villages.
Тогава можеш просто да кажеш $this->getUser()->getVillages() в контролера. Цялото това query-ване не е нужно :)
Но иначе линка за правене на собствени repository-та, който си дал е валиден :)
Вчера почти цял ден строших и нищо не се получи с тоя мапинг с OneToOne, OneToMany и т.н., колкото и да чета документацията на Doctrine по темата, все нещо не беше наред и биеше грешка я при записване на нов потребител, я при запис на ресурсите и на края реших да го заобиколя по селския начин, но явно ще трябва пак да го мисля...