启动
创建Symfony程序
symfony new my_project_name
运行Symfony
php bin/console server:run
ps:默认端口为8000,启动后通过http://localhost:8000/访问
Bundle系统
Symfony中的每一样东西都是bundle,包括框架核心功能,以及你编写的程序代码。bundle是Symfony体系中的一等公民。这就给了你一个弹性架构,既可以使用 第三方bundle 中的预建功能,也可以发布你自己的bundle。一个bundle,就是一组结构化的文件,存于一个“用于实现某个独立功能”的目录中。你可以创建一个BlogBundle,一个ForumBundle,或者是一个管理用户的bundle(很多类似bundle已经作为开源项目存在)。每个目录都包含着关乎那个功能的所有东西,包括php文件,模板,css,js文件,tests,以及其他。每一个功能的子项都存在于bundle中,每一个功能都存在于bundle中。
要在你的程序中使用bundle,必须通过 AppKernel
类的 registerBundles()
方法来注册并使用它们
Bundle目录结构
- Controller/
里面有该bundle的控制器(类)(如 `RandomController.php`)。 - DependencyInjection/
里面有特定的Dependency Injection Extension类,用来导入服务配置信息,注册compiler passes,以及更多内容(这个目录并非必需)。 - Resources/config/
存放配置信息,包括路由配置(`routing.yml` 等)。 - Resources/views
存放模板。依控制器名字来组织子文件夹(如 `Hello/index.html.twig`)。 - Resources/public
存放web assets资源(图片,css等),将通过硬拷贝或symlink方式导入到项目的 `web/` 目录,通过console命令 `assets:install` 实现。 - Entity/
存放实体类 - Tests/
存放本bundle的所有测试类。
控制器
控制器是一个你创建的php函数,它能够获取http请求信息并构建和返回一个http响应(作为Symfony的Response对象),Response可能是一个html页面、xml文档、一个序列化的json数组、图像、重定向、404错误或者一些其他你能够想像的。控制器包含了你应用程序需要渲染页面的任何逻辑。
Bundle(Bundle名) | Controller Class(控制器类名) | MMethod Name(控制器方法名) |
AppBundle | BlogController | showAction |
路由
Symfony 从一个 单一的 路由配置文件: app/config/routing.yml
中加载你的程序中的全部路由。但从这个文件中,你可以加载任何一个 其他的 路由文件。实际上,Symfony默认从你 AppBundle 中的 Controller/
目录中加载annotation路由配置,这就是为何Symfony能够看到我们的annotation路由:
配置
Symfony程序是由一组“负责呈现全部功能和可能性”的bundles所构成。每个bundle都可以通过YAML、XML或PHP格式的配置文件进行自定义。默认的主力配置文件是在app/config/
目录下,它可以是config.yml
、config.xml
或config.php
,根据你的偏好而定:
每一个根节点,比如framework
或twig
,定义了相应bundle的配置信息。例如,framework
键所定义的,是用于Symfony核心的FrameworkBundle之配置信息,包括路由配置、模板配置以及其他内核配置。
现在,毋须担心每个根节点下的特定配置选项。配置文件预装了一些有意义的默认配置。
数据库(Doctrine ORM)
配置数据库
真正开始之前,你需要配置你的数据库连接信息。按照惯例,这部分信息通常配置在 app/config/parameters.yml
文件中
创建一个Entity类
在Entity目录下创建实体类
@ORM\Entity表示为实体类
@ORM\Table(name="数据库表")
@ORM\Column(name="字段名",type="数据类型",nullable="是否为空(true,false)")
验证映射
php bin/console doctrine:schema:validate
生成Getters和Setters
php bin/console doctrine:generate:entities AppBundle/Entity/Product
持久化对象到数据库
public function createAction()
{
$product = new Product();
$product->setName('Keyboard');
$product->setPrice(19.99);
$product->setDescription('Ergonomic and stylish!');
$em = $this->getDoctrine()->getManager();
// tells Doctrine you want to (eventually) save the Product (no queries yet)
// 告诉Doctrine你希望(最终)存储Product对象(还没有语句执行)
$em->persist($product);
// actually executes the queries (i.e. the INSERT query)
// 真正执行语句(如,INSERT 查询)
$em->flush();
return new Response('Saved new product with id '.$product->getId());
}
从数据库中获取对象
public function showAction($productId)
{
$product = $this->getDoctrine()
->getRepository('AppBundle:Product')
->find($productId);
if (!$product) {
throw $this->createNotFoundException(
'No product found for id '.$productId
);
}
}
当要查询某个特定类型的对象时,总要使用respository,可以理解respository是一个php类,它唯一的工作就是帮助我们从特定类中取出entity。如上图所示。appBundle:Product
是快捷写法,我们可以在Doctrine里随处使用,以替代entity类的FQCN类名(如 AppBundle\Entity\Product
)。只要我们的entity存放在bundle的 Entity
命名空间下,它就会工作。
$repository = $this->getDoctrine()->getRepository('AppBundle:Product');
// query for a single product by its primary key (usually "id")
// 通过主键(通常是id)查询一件产品
$product = $repository->find($productId);
// dynamic method names to find a single product based on a column value
// 动态方法名称,基于字段的值来找到一件产品
$product = $repository->findOneById($productId);
$product = $repository->findOneByName('Keyboard');
// dynamic method names to find a group of products based on a column value
// 动态方法名称,基于字段值来找出一组产品
$products = $repository->findByPrice(19.99);
// find *all* products / 查出 *全部* 产品
$products = $repository->findAll();
使用DQL对象查询
$em = $this->getDoctrine()->getManager();
$query = $em->createQuery(
'SELECT p
FROM AppBundle:Product p
WHERE p.price > :price
ORDER BY p.price ASC'
)->setParameter('price', 19.99);
$products = $query->getResult();