Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP-Symfony:如何在';他是另一个班的吗?_Php_Symfony_Oop_Model View Controller_Symfony 2.8 - Fatal编程技术网

PHP-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 Symfony项目。现在我卡住了,所以我有一个控制器,它可以渲染视图。但在那个控制器内,我想访问另一个控制器并生成一个对象,因为我需要它的方法

简言之:如何在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()));
    }
}

从另一个控制器使用控制器的唯一方法是将控制器定义为服务,然后使用它

看看这个答案


这是官方文件

看起来你的问题实际上源于这样一个事实,你使用的控制器是错误的。您已经管理了推送应用程序逻辑,这导致了当前的问题

与其创建
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中,您通常会从所有公共方法返回一个
响应
实例)。