步骤6:创建控制器

5.2版本
维护 没有维护的
5.0

创建一个控制器

我们的guestbook项目已经在生产服务器上运行了,但是我们作弊了一点。该项目还没有任何网页。主页是一个无聊的404错误页面。让我们解决这个问题。

当HTTP请求进来时,比如主页(http://localhost:8000/), ob娱乐下载Symfony试图找到一个路线相匹配的请求路径(/这里)。一个路线请求路径和a之间的链接是PHP调用,该函数创建HTTP响应的请求。

这些可调用对象被称为“控制器”。在Syob娱乐下载mfony中,大多数控制器都是作为PHP类实现的。您可以手动创建这样的类,但因为我们喜欢快速地创建,所以让我们看看Symfony如何帮助我们。ob娱乐下载

懒惰的与制造者捆绑

为了轻松地生成控制器,我们可以使用ob娱乐下载symfony / maker-bundle包:

1
$ ob娱乐下载symfony composer req maker—dev

因为maker bundle只在开发过程中有用,所以不要忘记添加——开发标记,以避免在生产中启用它。

maker bundle可以帮助你生成很多不同的类。我们将在这本书中一直用到它。每个“生成器”都定义在一个命令中,所有命令都是使命令名称空间。

内置的Sob娱乐下载ymfony控制台列表command列出给定命名空间下所有可用的命令;使用它来发现maker bundle提供的所有生成器:

1
$ ob娱乐下载symfony控制台列表

选择配置格式

在创建项目的第一个控制器之前,我们需要决定我们想要使用的配置格式。ob娱乐下载Symfony支持YAML、XML、PHP和开箱即用的注释。

与包相关的配置,YAML是最好的选择。这是在配置/目录中。通常,当您安装一个新包时,该包的配方将添加一个以新文件结尾的文件.yaml该目录。

与PHP代码相关的配置,注释是更好的选择,因为它们是在代码旁边定义的。让我用一个例子来解释。当请求传入时,一些配置需要告诉Symfony请求路径应该由特定的控制器(PHP类)处理。ob娱乐下载当使用YAML、XML或PHP配置格式时,涉及两个文件(配置文件和PHP控制器文件)。在使用注释时,配置直接在控制器类中完成。

为了管理注释,我们需要添加另一个依赖项:

1
$ ob娱乐下载symfony composer req注释

您可能想知道如何猜测需要为某个特性安装的包名称?大多数时候,你不需要知道。在许多情况下,Symfony在ob娱乐下载其错误消息中包含要安装的包。运行ob娱乐下载:控制器没有注释例如,包会以一个异常结束,其中包含关于安装正确包的提示。

生成一个控制器

创建您的第一个控制器通过:控制器命令:

1
$ ob娱乐下载symfony控制台make:controller ConferenceController

该命令创建一个ConferenceController类下src /控制器/目录中。生成的类包含一些准备进行微调的样板代码:

src /控制器/ ConferenceController.php
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16
名称空间App \控制器;使用ob娱乐下载Symfony \包\ FrameworkBundle \ \ AbstractController控制器;使用ob娱乐下载Symfony \ HttpFoundation \ \组件响应;使用ob娱乐下载Symfony组件\ \路由\注释\路线;ConferenceController扩展AbstractController{#(路线(“/会议”,名字:“会议”))公共函数指数():响应{返回这个美元->渲染(“会议/ index.html.twig”,(“controller_name”= >“ConferenceController”,]);}}

#(路线(“/会议”,名称:“会议”)注解是什么使index ()方法a控制器(配置在其配置的代码旁边)。

当你遇到/会议在浏览器中,执行控制器并返回响应。

调整路线,使其与主页匹配:

patch_file
1 2 3 4 5 6 7 8 9 10 11
——/ src /控制器/ ConferenceController.php+ + + b / src /控制器/ ConferenceController.php@@ -8,7 +8,7 @@使用Symob娱乐下载fony\Component\Routing\Annotation\Route;类ConferenceController扩展AbstractController {- #[Route('/conference', name: 'conference')]+ #[Route('/', name: '主页')]public function index(): Response {return $this->render('conference/index.html. ');嫩枝”,(

这条路线的名字当我们想在代码中引用主页时将会很有用。而不是硬编码/路径,我们将使用路由名。

让我们返回一个简单的HTML页面,而不是默认的渲染页面:

patch_file
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
——/ src /控制器/ ConferenceController.php+ + + b / src /控制器/ ConferenceController.php@@类ConferenceController扩展了AbstractController#[Route('/', name: '主页')]public function index(): Response {-返回$ this - >渲染(会议/ index . html。嫩枝”,(- 'controller_name' => 'ConferenceController',-]);+返回新的响应(<<+ < html >身体+ < >身体+ < / >+ < / html >+ EOF+);}}

刷新浏览器:

控制器的主要职责是返回HTTP响应的请求。

加一个复活节彩蛋

为了演示响应如何利用来自请求的信息,让我们添加一个小的复活节彩蛋。每当主页包含一个查询字符串,如你好=法比安,让我们添加一些文字来问候这个人:

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
——/ src /控制器/ ConferenceController.php+ + + b / src /控制器/ ConferenceController.php@@ -3,6 +3,7 @@名称空间的应用程序\控制器;控制器使ob娱乐下载用Symfony \包\ FrameworkBundle \ \ AbstractController;+使用Syob娱乐下载mfony \ HttpFoundation \ \组件请求;组件使用ob娱乐下载Symfony \ \ HttpFoundation \反应;使用Syob娱乐下载mfony \组件\路由\注释\路线;@@类ConferenceController扩展了AbstractController#(路线(“/”,名字:“主页”))—public function index():响应+公共函数索引(请求$请求):响应{+ $greet = ";+ if ($name = $request->query->get('hello')) {+ $greet = sprintf('

Hello %s!< / h1 >”,htmlspecialchars函数(名字)美元);+}+返回新的响应(<< )+ $问候< font face ="宋体" > < div style =" font - size: 16px

ob娱乐下载Symfony通过一个请求对象。当Symfob娱乐下载ony看到带有这种类型提示的控制器参数时,它自动知道要将它传递给您。我们可以用它来的名字项,并添加<标题>标题。

试着打/然后/ ?你好=法比安在浏览器中查看区别。

请注意

注意呼叫htmlspecialchars函数()避免XSS问题。当我们切换到合适的模板引擎时,这是可以自动完成的。

我们也可以把名字作为URL的一部分:

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
——/ src /控制器/ ConferenceController.php+ + + b / src /控制器/ ConferenceController.php@@ -9,13 +9,19 @@使用Symob娱乐下载fony\Component\Routing\Annotation\Route;类ConferenceController扩展AbstractController {#[Route('/', name: '主页')]+ #[Route('/hello/{name}', name: '主页')]—public function index():响应+ public function index(string $name = "):响应{+ $greet = ";+ if ($name) {+ $greet = sprintf('

Hello %s!< / h1 >”,htmlspecialchars函数(名字)美元);+}+返回新的响应(<< )+ $问候< font face ="宋体" > < div style =" font - size: 16px

{名称}部分路线是动态的线路参数-它就像一个通配符。现在可以按下/你好然后/ hello /法比安在浏览器中获得与之前相同的结果。你可以得到价值{名称}参数,通过添加具有相同参数的控制器的名字。所以,美元的名字


该工作,包括代码示例,根据anc - sa知识共享4.0许可证。