Symfony5系列教程4-创建控制器

这个教程是基于symfony5进行编写,以后再出高版本的symfony,那么就可以只出一套针对这个高版本的特性进行编写,该系列教程会一直延续更新。

点赞再看,养成习惯,微信搜索公众号【程序员老班长】关注这个互联网老班长,查看更多系列文章

目录

1,使用命令创建控制器:

2,  获取当前登录用户:app.user

3,生成URL

4,重定向

5,渲染模板

6,使用服务

7,返回异常和404错误

8,在控制器中获取请求对象。

9,管理session

10,提示信息

11 获取配置文件中的值

12,返回json对象

13,file方法


控制器是web请求过程中的核心,复杂响应前端请求和调度后端业务逻辑。

控制器起到一个承前控后的中枢能力,类似足球赛场的核心中场,前端页面模板就是前锋,用展示页面带给客户惊喜,后端的业务逻辑包括数据处理就是足球场上的后卫,负责向前运球和安全防卫数据层。

这里主要是列出在实际项目中关于控制器常用到的相关知识。

1,使用命令创建控制器:

前面文章中提到了手动创建控制器文件,在这里介绍一下使用命令的方式创建控制器。

 php bin/console make:controller BrandNewControllercreated: src/Controller/BrandNewController.phpcreated: templates/brandnew/index.html.twig

 这个命令会生成控制器文件以及默认的模板文件,

同时会生成模板文件:  /templates/brand_new/index.html.twig

也可以根据实体类进行生成增删改查,这个后面会介绍。

代码生成只是一个辅助工具,在初学的时候建议以自己手敲代码为主。

2,  获取当前登录用户:app.user

输出当前登录用户的用户名:

<p>Username: {{ app.user.username ?? 'Anonymous user' }}</p>

3,生成URL

generateUrl,根据路由生成URL,可以传入参数

$url = $this->generateUrl('app_lucky_number', ['max' => 10]);

这个URL是根据路由名字和参数进行生成的

4,重定向

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
use Symfony\Component\HttpFoundation\RedirectResponse;

// ...
public function index()
{
    //重定向名字为homepage的路由
    return $this->redirectToRoute('homepage');

    
    // 实现永久重定向
    return $this->redirectToRoute('homepage', [], 301);

    // 重定向路由,附加上这个路由需要的参数
    return $this->redirectToRoute('app_lucky_number', ['max' => 10]);

    // 重定向路由,附加收到的请求的参数值
    return $this->redirectToRoute('blog_show', $request->query->all());

    // 重定向外部的URL
    return $this->redirect('http://symfony.com/doc');
}

5,渲染模板

// 渲染模板文件 :  /lucky/number.html.twig
return $this->render('lucky/number.html.twig', ['number' => $number]);

6,使用服务

在控制器中可以使用symfony的服务容器,进行依赖注入实例。

关于服务容器后续文章会介绍。

一般是使用构造函数进行注入,和在方法名称中定义变量

比如下面代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
use Psr\Log\LoggerInterface;
// ...

/**
 * @Route("/lucky/number/{max}")
 */
public function number($max, LoggerInterface $logger)
{
    $logger->info('We are logging!');
    // ...
}

7,返回异常和404错误

在业务处理代码中,在某特定的业务场景下需要返回异常或404错误,

特定的异常可以根据业务定制,定义的异常类代码例子如下:

throw new \Exception('Something went wrong!');

 同理,关于404错误,可以返回: NotFoundHttpException。

8,在控制器中获取请求对象。

在控制器的方法中,定义方法变量就行,这个变量会自动被控制器依赖注入。

1
2
3
4
5
6
7
8
use Symfony\Component\HttpFoundation\Request;

public function index(Request $request, $firstName, $lastName)
{
    $page = $request->query->get('page', 1);

    // ...
}

上面这个代码定义了$request这个变量,这个变量的赋值,是被容器控制的,无需关心,只需在这个方法中使用它就行。

9,管理session

同上面request对象,控制器用同样的方法管理session

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
use Symfony\Component\HttpFoundation\Session\SessionInterface;

public function index(SessionInterface $session)
{
    //session中 设置属性值
    $session->set('foo', 'bar');

    // session中 获取属性值
    $foobar = $session->get('foobar');

    // session中获取属性值,如果没有的话,后面的参数就是默认值
    $filters = $session->get('filters', []);
}

10,提示信息

有的业务在用户操作完成后,需要提示给用户一个信息,这个时候就是用addFlash方法。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
use Symfony\Component\HttpFoundation\Request;

public function update(Request $request)
{
    // ...

    if ($form->isSubmitted() && $form->isValid()) {
        // do some sort of processing

        $this->addFlash(
            'notice',
            'Your changes were saved!'
        );
        // $this->addFlash() is equivalent to $request->getSession()->getFlashBag()->add()

        return $this->redirectToRoute(...);
    }

    return $this->render(...);
}

11 获取配置文件中的值

在项目的congfig目录下是存放了配置文件的,在控制器中有时候会需要获取这个配置文件的某个变量值的,这个时候就需要用getParameter方法。

1
2
3
4
5
6
// ...
public function index()
{
    $contentsDir = $this->getParameter('kernel.project_dir');
    // ...
}

这个代码就是获取配置文件中的kernel.project_dir值。

至于是哪个配置文件,后面会在配置小节里面介绍。

12,返回json对象

在api中我们就需要返回一个json对象,这个时候就需要用到json方法。

1
2
3
4
5
6
7
8
9
// ...
public function index()
{
    // 返回 '{"username":"jane.doe"}'
    return $this->json(['username' => 'jane.doe']);

 
}

json方法会设置 Content-Type header的。

在实际项目中,这个json方法对于复杂的实体操作显得会力不从心,我们一般会选择用第三方的bundle实现这个功能。

13,file方法

根据官方介绍,这个方法是返回文件流,但是这个地方需要注意,它返回的文件流是对文件内容全部获取,如果这个文件太大的话,会导致内存崩溃。

解决方案是写一个循环,循环读取和返回,以大化小。

  $file = new File('/path/to/some_file.pdf');

    return $this->file($file);

上面就是在控制器中常用到的技术点。

文章持续更新,可以微信搜索公众号「 程序员老班长 」查看更多文章。

猜你喜欢

转载自blog.csdn.net/liliangzhao/article/details/106185176
今日推荐