symfony06:运行symfony

来源:互联网 发布:淘宝卖家怎么寄快递 编辑:程序博客网 时间:2024/06/16 09:52

建立一个应用

就像前面提到的,应用必须包含在项目中,因此建立应用要先创建一个项目

Mkdir myproject

Cd myproject

Symfony init-project myproject

接下来创建一个应用

Symfony init-app myapp    或者   symfony app myapp

配置WEB服务器,创建一个虚拟主机站点

<VirtualHost *:80>

  ServerName myapp.example.com

  DocumentRoot "/home/steve/myproject/web"

  DirectoryIndex index.php

  Alias /sf /$sf_symfony_data_dir/web/sf

  <Directory "/$sf_symfony_data_dir/web/sf">

    AllowOverride All

    Allow from All

  </Directory>

  <Directory "/home/steve/myproject/web">

    AllowOverride All

    Allow from All

  </Directory>

</VirtualHost>

$sf_symfony_data_dirsymfony的数据目录,通过pear config-show查看

重启Apache服务器,然后通过http://localhost/myapp_dev.php/测试,应该没有问题(有问题基本就是APACHE虚拟站点的问题)。

TIPS:关于域名,Linux系统可以修改/etc/hosts文件随意的添加,只限本地测试使用。

页面创建基础

创建模块骨架

cd myproject

symfony init-module myap mymodule

通过http://localhost/myapp_dev.php/mymodule/index查看结果

添加一个页面

Symfony中,页面逻辑放在动作(action)中,表现(表示)放在模板中,一个没有逻辑的页面仍然需要一个空的动作。

添加一个动作

在文件myproject/apps/myapp/modules/mymodule/actions/actions.class.php中添加execute方法

<?php

 

class mymoduleActions extends sfActions

{

  public function executeMyAction()

  {

  }

}

添加一个模板

myproject/apps/myapp/modules/templates/下创建模板myActionSuccess.php

<p>Hello, world!</p>

通过http://localhost/myapp_dev.php/mymodule/myAction测试结果

从动作中传送信息到模板

修改动作如下:

<?php

 

class mymoduleActions extends sfActions

{

  public function executeMyAction()

  {

    $today = getdate();

    $this->hour = $today['hours'];

  }

}

 

修改模板如下:

<p>Hello, world!</p>

<?php if ($hour >= 18): ?>

<p>Or should I say good evening? It's already <?php echo $hour ?>.</p>

<?php endif; ?>

从用户表单收集信息

包含普通HTML代码的模板

<p>Hello, world!</p>

<?php if ($hour >= 18): ?>

<p>Or should I say good evening? It's already <?php echo $hour ?>.</p>

<?php endif; ?>

<form method="post" target="/myapp_dev.php/mymodule/anotherAction">

  <label for="name">What is your name?</label>

  <input type="text" name="name" id="name" value="" />

  <input type="submit" value="Ok" />

</form>

 

一个Helper就是一个symfony定义的PHP函数,被用在模板页中。Helper自动输出一些要比你亲自写代码快的多的HTML代码,使用symfonyHelpers,你可以得到和上面一样的代码:

<p>Hello, world!</p>

<?php if ($hour >= 18): ?>

<p>Or should I say good evening? It's already <?php echo $hour ?>.</p>

<?php endif; ?>

<?php echo form_tag('mymodule/anotherAction') ?>

  <?php echo label_for('name', 'What is your name?') ?>

  <?php echo input_tag('name') ?>

  <?php echo submit_tag('Ok') ?>

</form>

你可能认为,使用Helper并不必写HTML代码方便多少,请看下面:

<?php

>     $card_list = array(

>       'VISA' => 'Visa',

>       'MAST' => 'MasterCard',

>       'AMEX' => 'American Express',

>       'DISC' => 'Discover');

>     echo select_tag('cc_type', options_for_select($card_list, 'AMEX'));

>     ?>

输出的结果:

<select name="cc_type" id="cc_type">

  <option value="VISA">Visa</option>

  <option value="MAST">MasterCard</option>

  <option value="AMEX" selected="selected">American Express</option>

  <option value="DISC">Discover</option>

</select>

到其他动作(Action

看下面的代码

<a href="/myapp_dev.php/mymodule/anotherAction?name=anonymous">

  普通HTML格式链接

</a>

上面的链接方式在URL重写后将会出现问题,因此需要采取link_to()helper来创建链接:

<?php echo link_to('linkd_to链接方式','mymodule/anotherAction?name=anonymous') ?>

这样,当你调整URL重写规则后,link_to()将自动转换生成的HTML代码到正确格式。

多数的helpers接受可选的参数

// Option argument as an associative array

<?php echo link_to('I never say my name', 'mymodule/anotherAction?name=anonymous',

  array(

    'class'    => 'special_link',

    'confirm'  => 'Are you sure?',

    'absolute' => true

)) ?>

 

// Option argument as a string

<?php echo link_to('I never say my name', 'mymodule/anotherAction?name=anonymous',

  'class=special_link confirm=Are you sure? absolute=true') ?>

获取信息(从Request

从请求中获取信息使用sfActionsgetRequestParameter()方法,例如:

<?php

 

class mymoduleActions extends sfActions

{

  ...

 

  public function executeAnotherAction()

  {

    $this->name = $this->getRequestParameter('name');

  }

}

对于简单数据,你不需要在动作中获取参数,模板能通过调用$sf_params对象的get()方法直接访问参数,就像动作中的getRequestParameter()方法一样

<p>Hello, <?php echo $sf_params->get('name') ?>!</p>    //在模板中使用

为什么不使用$_POST,$_GET或者$_REQUEST变量了呢?因为你的URLs被格式化为不同的形式(就像http://localhost/articles/europe/france/finance.html, 没有 ?也没有 =),因此常规PHP变量将无法使用。并且只有路由系统(Routing System)可以获取到Request参数。同时你希望能够加入过滤器来防止代码注入,那保持请求参数在一个干净的参数仓库将是唯一选择。

$sf_params比普通的getter更强大,如果你只想测试请求参数是否存在,可以使用$sf_params->has()方法来代替测试get()的值是否存在。

在模板中测试请求参数是否存在

<?php if ($sf_params->has('name')): ?>

  <p>Hello, <?php echo $sf_params->get('name') ?>!</p>

<?php else: ?>

  <p>Hello, John Doe!</p>

<?php endif; ?>

还有更好的方式,呵呵:

<p>Hello, <?php echo $sf_params->get('name', 'John Doe') ?>!</p