Symfony学习笔记 - Symfony Documentation - Getting Started(上)
1、 Setup / Installation
a、Creating Symfony Applications
symfony new my_project_directory --version="7.3.x" --webapp
symfony new my_project_directory --version="7.3.x"
两种方式的区别是,第一种需要按照跟多的package,可以一个web application。后面是创建一个api/微服务/console app。
b、Running Symfony Applications
symfony自带了php的运行环境,此运行环境不包括mysql、redis等,仅是一个php开发环境,方便本地开发。
cd my-project/ symfony server:start
此命令可以启动php dev server
c、Checking Security Vulnerabilities
symfony check:security
2、Create your First Page in Symfony
a、Create a controller
可以在src/Controller/目录下,创建一个新的Controller,作为响应http request的入口
b、Create a route
即可以直接在创建的Controller上,通过属性配置路由信息,也可以在config/routes.yaml里面,配置路由信息,使其指向a中创建的Controller。
3、Route
a、匹配环境
可以在routes.yaml中,通过:
when@dev: tools: path: /tools controller: App\Controller\DefaultController::developerTools
来指定,该配置,仅在开发环境下有效。
b、匹配表达式
还可以配置表达式,来定义路由:
post_show: path: /posts/{id} controller: App\Controller\DefaultController::showPost # expressions can retrieve route parameter values using the "params" variable condition: "params['id'] < 1000"
c、Debugging Routes
路由太多了,可以通过命令一次性展示所有的路由,包括其Method(get/post/put/delete)及scheme(http/https)。
php bin/console debug:router
d、Route Parameters
Symfony的路由参数,通过{}进行包裹。
config/routes.yaml blog_show: path: /blog/{slug} controller: App\Controller\BlogController::show
,当访问/blog/my-first-post时,在BlogController的show方法里面,$slug = 'my-first-post'可以获取到,获取的方式有两种:
public function show(string $slug): Response
public function show(Request $request): Response { $slug = $request->attributes->get('slug'); // 从路由属性中获取 // ... }
e、可以指定参数的有效性验证
比如,下面的要求,参数page必须是数字。
config/routes.yaml blog_list: path: /blog/{page} controller: App\Controller\BlogController::list requirements: page: '\d+'
f、定义参数的默认值
blog_list: path: /blog/{page} controller: App\Controller\BlogController::list defaults: page: 1 requirements: page: '\d+'
e、定义路由的优先级
在routes.yaml中,可以通过调整路由的前后顺序,来定义路由的优先级。Controller的属性层面,则可以通过为priority赋值,来定义其优先级。
f、Parameter Conversion
参数转换。将字符串参数自动转换为实体对象。内部是通过Doctrine的EntityManager的find方法,查找id或者其他的内容,返回实体。如果找不到,抛出异常。
`
class BlogController extends AbstractController
{
// ...
#[Route('/blog/{slug:post}', name: 'blog_show')]
public function show(BlogPost $post): Response
{
// $post is the object whose slug matches the routing parameter
// ...
}
}
`
g、自动转换enum参数
h、特殊的参数
比如controller、_locale、_format等。
i、额外的参数
在defaults中,可以定义一些额外的参数给controller。
j、路由参数中的斜杆字符
如果路由参数中,允许包含斜杠字符,那么需要在正则表达式中设定更宽松的规则。但是,如果两个或多个参数中,都运行包含斜杠字符串,那么会导致截取混乱。
share: path: /share/{token} controller: App\Controller\DefaultController::share requirements: token: .+
k、路由别名
可以为新的一个路由,通过定义别名的方式,继承上面路由的所有所有定义。
l、弃用路由别名
提示废弃某个路由。
**m、路由组和前缀
用于高效组织和管理路由功能。
n、子域路由
可以设定路由的host属性,并可以以变量的方式设定host,且可以限定变量的取值。
mobile_homepage: path: / host: "{subdomain}.example.com" controller: App\Controller\MainController::mobileHomepage defaults: subdomain: m requirements: subdomain: m|mobile
**o、本地化路由
mobile_homepage: path: / host: "{subdomain}.example.com" controller: App\Controller\MainController::mobileHomepage defaults: subdomain: m requirements: subdomain: m|mobile
其余的很多
Symfony的路由功能非常强大,是其框架的核心优势之一。