1/安装
composer require silex/silex:~2.0
目录结构:
├── composer.json
├── composer.lock
├── vendor
│ └── ...
└── web
└── index.php
2/Web服务 : nginx的配置 http://silex.sensiolabs.org/doc/master/web_servers.html
3/引导:
require_once DIR.’/../vendor/autoload.php’;
create a instance of Silex\Application 建立一个实例
定义controller后调用 run 方法。
$app['debug'] = true; 开启debug
4/路由:
在silex中你定义一个路由,当该路由被访问时调用响应的controller,一个路由组成为:
1,pattern:路由pattern定义了指向资源的路径,一个pattern可以包含多条部分。
2 , Method:HTTP 方法:GET/POST/PUT等
一个controller使用如下的闭包定义:
function () {
// ... do something
}
闭包的返回值成为页面的一部分。
GET路由的例子:
$blogPosts = array(
1 => array(
'date' => '2011-03-29',
'author' => 'igorw',
'title' => 'Using Silex',
'body' => '...',
),);
$app->get('/blog', function () use ($blogPosts)
{
$output = '';
foreach ($blogPosts as $post) {
$output .= $post['title'];
$output .= '<br />';
}
return $output;
});
访问/blog 将返回一个blog post title 的列表。
5/动态路由:
创建另一个控制器来支持展示私人博客帖子。
$app->get('/blog/{id}', function (Silex\Application $app, $id) use ($blogPosts) {
if (!isset($blogPosts[$id])) {
$app->abort(404, "Post $id does not exist.");
}
$post = $blogPosts[$id];
return "<h1>{$post['title']}</h1>".
"<p>{$post['body']}</p>";
});
6/POST路由:
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
$app->post('/feedback', function (Request $request)
{
$message = $request->get('message');
mail('feedback@yoursite.com', '[YourSite] Feedback', $message);
return new Response('Thank you for your feedback!', 201);
});
7/其他方法
8/路由变量:
可以在路由中定义变量:
app−>get(′/blog/id′,function(
id) {
// …
});
还可以定义多个变量
$app->get('/blog/{postId}/{commentId}', function ($postId, $commentId) {
// ...
});
还可以这样(注意参数位置)
$app->get('/blog/{postId}/{commentId}', function ($commentId, $postId) {
// ...
});
你还可以请求当前的Request请求和Application对象
$app->get('/blog/{id}', function (Application $app, Request $request, $id) {
// ...
});
9/路由变量转换器:
在路由变量进入controller判断之前,还可以添加一些转换器
app−>get(′/user/id′,function(
id) {
// …
})->convert(‘id’, function (id) { return (int)id; });
这在你想转换路由变量成为对象以便在不同控制器中重复转换编码时很有用。
$userProvider = function ($id) {
return new User($id);
};
$app->get('/user/{user}', function (User $user) {
// ...
})->convert('user', $userProvider);
$app->get('/user/{user}/edit', function (User $user) {
// ...
})->convert('user', $userProvider);
还可以接受Requset请求作为第二参数
$callback = function ($post, Request $request) {
return new Post($request->attributes->get('slug'));
};
$app->get('/blog/{id}/{slug}', function (Post $post) {
// ...
})->convert('post', $callback);简直碉堡了
转换器还可以被定义为service。
use Doctrine\Common\Persistence\ObjectManager;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
class UserConverter
{
private $om;
public function __construct(ObjectManager $om)
{
$this->om = $om;
}
public function convert($id)
{
if (null === $user = $this->om->find('User', (int) $id)) {
throw new NotFoundHttpException(sprintf('User %d does not exist', $id));
}
return $user;
}
}
service 需要在 application 中注册,它的convert方法将被作为转换器
$app['converter.user'] = function () {
return new UserConverter();
};
$app->get('/user/{user}', function (User $user) {
// ...
})->convert('user', 'converter.user:convert');
10/Requirements请求
11/条件