Symfony 2入门简介

  tr
  PHP相关
  2011-04-13
   symfony  增加更多TAG »
  4,679次

我一直关注Symfony这个框架。最近这个框架推出了Symfony 2,其官方站点也迁移到了http://symfony.com/。目前这个框架还没有正式发布,写作本文时可以下载到的是PR10版本(下载地址请戳这里)。

请注意:Symfony 2需要PHP 5.3的支持,因为它用到了PHP的新特性namespace。

由于SF2还是在PR阶段,有一些问题还是很正常的。最突出的是,对cache的管理存在着很大的bug。例如,清空缓存的命令:

app/console cache:clear

这个命令会出错,提示对app/cache下的某个目录无法进行写操作,而之前即使你使用了chmod命令将cache目录设置为777也是没有用的。你需要再次运行chmod,然后再cache:clear才可以。另外一个问题就是,app_dev.php(开发环境)和app.php(应用环境)有时不能同步,往往出现app_dev下可以的,在app.php下不可以的情况。这应该是和cache的管理有关。

另外,由于SF2的web目录下不再使用index.php作为应用的入口,而改用app.php或者app_dev.php作为入口,开发人员不仅需要配置web/.htaccess文件(所幸的是SF2自带了一个,而且是可用的),还要修改站点的vhost文件,将该目录的Allowoverride修改为All。

========

SF2的另一个根本性的变化时引入了Doctrine 2作为其DBAL和ORM。而Doctrine 2的最大变化就是抛弃了所谓的Active Record的操作,而引入了所谓的Domain Driven Design (DDD)的概念。什么是AR?什么是DDD?这两个概念的介绍本身都需要一大本书,但是作为基本的理解,我们可以看一个对比:

//假定我们已经对一个需要持续化的对象进行了建模
//在AR模式下我们这样操作:
$post->save();
 
//在DDD模式下我们这样操作:
$manager=//...获得对象管理员的实例
$manager->persist($post);
$manager->flush();

DDD认为,只有一个对象的建模是按照其实际世界的原型而进行时,才是最好的建模。换句话说,一个post对象自己不能保存自己,而必须有一个管理者(SF2中称为Entity Manager)来进行这个操作。

这么做,至少有一个好处:对数据对象的操作都在内存中进行,直到flush后才持续化到数据库中去。另外一个好处是——还没有测试——根据SF2的文档,在修改表结构的时候——或者更确切的说是修改对象模型(一个类)的时候,对数据库结构的修改是叠加式的,而不是从头开始。这样,之前的数据可以得到保存,而不像SF1中,每次重建数据库都会删除之前的数据。

=======

最后我说说安装、配置。应该说SF2的配置非常简单。SF2将所有的“应用”都视作一个bundle,映射到一个namespace,物理上映射到磁盘上的一个目录结构。

解压,比如:/var/www/Symfony就可以了。

然后修改你的vhost文件,指定DocumentRoot到/var/www/Symfony/web就可以。另外,web目录下有 个.htaccess文件,可以看看。这个需要在你的vhost文件中设置Override All比较好。然后重启apache,访问:localhost/app_dev.php就可以了。

然后是创建新的bundle:app/console init:bundle "tr/DemoBundle" src就可以在Symfony/src下创建一个新的bundle:tr/DemoBundle,这也是它的目录结构。

然后要注册namespace和autoload:

// app/AppKernel.php
class AppKernel extends Kernel
{
    public function registerBundles()
    {
        $bundles = array(
            new Symfony\Bundle\FrameworkBundle\FrameworkBundle(),
            new Symfony\Bundle\SecurityBundle\SecurityBundle(),
            ... ...
            new tr\DemoBundle\trDemoBundle(),
 
// app/autoload.php
use Symfony\Component\ClassLoader\UniversalClassLoader;
$loader = new UniversalClassLoader();
$loader->registerNamespaces(array(
    'Symfony'    => array(__DIR__.'/../vendor/symfony/src', __DIR__.'/../vendor/bundles'),
    ... ...
    'tr'         => __DIR__.'/../src',

然后就是常规的修改controller/view之类的工作了。SF2建议使用twig这个也是由Symfony创始人Fabien Potencier创建的模板引擎。基本语法可以查查这里:http://www.twig-project.org/,应该说还是很简单的。

当然,你可以修改一下routing.yml,SF2可以使用嵌套routing,具体语法可以参考文档。我现在的app/config /routing.yml很简单:

homepage:
    pattern: /
    defaults: { _controller: trDemoBundle:Default:index }

这样的话,访问localhost/app_dev.php就可以到自己的主页。

本文推送到[go4pro.org]


除非另有来自Go4Pro.org或原作者的显式声明,本站点所有文章都按照知识共享许可协议知识共享署名-非商业性使用-禁止演绎 3.0 未本地化版本许可协议进行许可。

Go4Pro.org,V3.0,2009-2014。本站点采用SymfonyBootstrapTwig等技术开发。