建立一个应用
就像前面提到的,应用必须包含在项目中,因此建立应用要先创建一个项目
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_dir
是symfony的数据目录,通过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代码,使用symfony的Helpers,你可以得到和上面一样的代码:
<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', '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)
从请求中获取信息使用sfActions的getRequestParameter()方法,例如:
<?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 |