我为学习目的制作了一个PHP Symfony项目。现在我卡住了,所以我有一个控制器,它呈现一个视图。但在Controller内部我想访问另一个Controller并创建一个对象,因为我需要它的方法。
简而言之:如何在Symfony的另一个类中创建一个类/对象?
这是我的代码:
<?php
namespace AppBundle\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\PasswordType;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use AppBundle\Entity\User;
use AppBundle\Controller\LoginController;
class HomeController extends Controller
{
/**
* @Route("/", name="home")
*/
public function renderIndexAction(Request $request)
{
$user = new User();
$form = $this->createFormBuilder($user)
->add('username', TextType::class, array('label' => 'username:'))
->add('password', PasswordType::class, array('label' => 'password:'))
->add('save', SubmitType::class, array('label' => 'login'))
->getForm();
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$user = $form->getData();
$user_username = $user->getUsername();
$user_password = $user->getPassword();
$loginController = new LoginController();
$user = $loginController->checkAction();
$session = $request->getSession();
$data = "test";
$session->set('form_data', $data);
return $this->redirectToRoute('addressbook');
}
return $this->render('home/index.html.twig', array('form' => $form->createView()));
}
}
所以我想在HomeController中使用LoginController。但它给了我一个错误:
调用成员函数has()on null 500内部服务器错误 - FatalThrowableError
PS:是的,我知道我的应用程序不安全,但我仍然在学习基本的OOP。所以调用这样的LoginController可能是一种奇怪的方式。但它是出于学习目的。
答案 0 :(得分:1)
看起来您的问题实际上源于您使用控制器错误的事实。您已经在其中管理了应用程序逻辑,这导致了您当前的问题。
不是创建User
实例并在控制器中进行身份验证,所有这些都应由服务(如Authentication
服务)处理。如果控制器需要访问服务,则应将所述服务作为依赖项传递给该控制器。
这也为您提供了一种在多个控制器之间共享逻辑的自然方式,因为多个控制器可以依赖于相同的服务。
<强>更新强>
因此,services.yml
文件看起来有点像这样:
services:
controller.auth:
class: 'Application\Controller\Authentication'
arguments: ['@service.recognition', '@service.comunity']
controller.account:
class: 'Application\Controller\Authentication'
arguments: ['@service.comunity']
service.recognition:
class: 'Model\Service\Recognition'
service.community:
class: 'Model\Service\Community'
在这种情况下,Community
服务在两个不相关的控制器之间共享。
P.S。您可能会发现this post有用
答案 1 :(得分:0)
您可以使用另一个控制器的控制器的唯一方法是将控制器定义为服务,然后使用它。
看一下这个答案how-to-access-a-different-controller-from-inside-a-controller-symfony2