PHP-Symfony:如何在';他是另一个班的吗?
为了学习,我做了一个PHP Symfony项目。现在我卡住了,所以我有一个控制器,它可以渲染视图。但在那个控制器内,我想访问另一个控制器并生成一个对象,因为我需要它的方法 简言之:如何在Symfony中的另一个类中创建类/对象 这是我的代码:PHP-Symfony:如何在';他是另一个班的吗?,php,symfony,oop,model-view-controller,symfony-2.8,Php,Symfony,Oop,Model View Controller,Symfony 2.8,为了学习,我做了一个PHP Symfony项目。现在我卡住了,所以我有一个控制器,它可以渲染视图。但在那个控制器内,我想访问另一个控制器并生成一个对象,因为我需要它的方法 简言之:如何在Symfony中的另一个类中创建类/对象 这是我的代码: <?php namespace AppBundle\Controller; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; use Symfony\Bundle\Framew
<?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()));
}
}
从另一个控制器使用控制器的唯一方法是将控制器定义为服务,然后使用它
看看这个答案
这是官方文件看起来你的问题实际上源于这样一个事实,你使用的控制器是错误的。您已经管理了推送应用程序逻辑,这导致了当前的问题
与其创建User
实例并在控制器中进行身份验证,所有这些都应该由服务来处理(比如authentication
service)。如果控制器需要访问服务,则应将所述服务作为依赖项传递给该控制器
这也为您提供了一种在多个控制器之间共享逻辑的自然方式,因为多个控制器可以依赖于相同的服务
更新
因此,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'
在这种情况下,社区
服务在两个不相关的控制器之间共享
p.S.你可能会觉得有用
从那里你需要什么方法?在这里添加代码。您可能希望将其提取到单独的服务中并注入到两个控制器中,而不是尝试在另一个控制器中创建控制器。如果您希望访问另一个控制器的另一个端点,请查找子请求。如果要重复使用另一个控制器的方法,请将该方法设置为服务,并在两个控制器中注入并使用该服务。您不想在控制器中使用另一个控制器的实例,这是错误的逻辑;您应该了解MVC原则。在您的情况下,您可能希望创建另一个类—服务类,并且两个控制器都将使用该服务。您还应该阅读有关加载服务类的依赖项注入的内容。为什么在另一个控制器中创建一个控制器是错误的?我只想从另一个类中的一个类生成一个对象?我正在尝试从该控制器生成一个服务。在services.yml:services:app.login\u controller:class:AppBundle\controller\LoginController中写这个就足够了吗?我可以这样调用LoginController:$LoginController=app.login\u controller?如果您需要从另一个控制器调用一个控制器,那么您犯了一个架构错误。@tereško我同意,只是为了准确起见,如果您检测到请求应由另一个控制器处理,在这种情况下,您可以将请求转发给另一个控制器。这是一个特殊的例子,不用担心,只要知道它的存在,为什么在另一个控制器中设置一个控制器是错误的?我只想从另一个类中的一个类生成一个对象?我正在尝试从该控制器生成一个服务。在services.yml:services:app.login\u controller:class:AppBundle\controller\LoginController中写这个就足够了吗?我可以这样调用LoginController:$LoginController=app.login\u controller?NVM,现在可以用了。我现在正在使用服务。这个链接解释了这一点:为什么在另一个控制器中设置一个控制器是错误的?我只想从另一个类中的一个类生成一个对象?我正在尝试从该控制器生成一个服务。在services.yml:services:app.login\u controller:class:AppBundle\controller\LoginController中写这个就足够了吗?我可以这样调用LoginController:$LoginController=app.login\u controller?NVM,现在可以用了。我现在正在使用服务。此链接对此进行了解释:@alandibat更新以显示一个示例。请不要从控制器类中调用DI容器。@alandibat至于“为什么这是个坏主意”,有两个原因。首先,它会导致控制器之间的紧密耦合(这应该是应用程序中最轻量级的部分)。这也意味着,您的控制器现在有额外的责任——“在单独的上下文中重新执行”。aa而且,您还可能会遇到一些没有一致方法的“控制器”(如在Sf2.x中,您通常会从所有公共方法返回一个响应
实例)。