davedevelopment / tinder
为silex提供清洁代码启用器
Requires
- davedevelopment/pimple-aware-event-dispatcher: 2.0.x-dev
- silex/silex: ~1.0
Requires (Dev)
- twig/twig: >=1.8,<2.0-dev
Suggests
- twig/twig: >=1.8,<2.0-dev
This package is auto-updated.
Last update: 2024-09-06 11:03:40 UTC
README
🔥 🔥 使用Silex和Tinder,您的应用程序将燃起 🔥 🔥
为Silex提供的一些辅助工具,帮助您尽可能地将边界移动到控制器之外。解释为什么您可能想要这样做有些困难,但最终我希望有一个示例应用程序可以展示一些好处。
在这个阶段,Tinder与Silex完全向后兼容,因此您应该能够实例化或扩展Tinder\Application
,而不是Silex\Application
,并且您现有的功能仍然可以工作。
目录
控制器作为服务
更新 - 现在它作为ServiceControllerServiceProvider 可用,Tinder默认启用。
参数注入
Tinder扩展了默认控制器解析器,允许直接将HTTP GET或POST变量注入为控制器参数。
<?php // an array called query will be GET vars $app->get("/search", function (array $query) { }); // an array called params will be POST vars $app->post("/blog/posts", function (array $params) { });
为什么? 这意味着您的控制器可以依赖于任意数组的查询变量或参数,而不是Symfony\Component\HttpFoundation\Request
。想要在CLI和Web界面之间共享控制器代码吗?
模板渲染
Tinder添加了一个简单的路由助手,允许您从控制器返回一个上下文变量数组,并由路由上定义的twig模板渲染。可选的第二个参数允许您在传递给模板之前操纵返回的数据,允许使用展示者或ViewModel等。
<?php $app->get("/dave", function() { return array( "rating" => rand(1,10), ); }) ->template("dave.html.twig", function($data) { $data['rating'] = 10; return $data; });
为什么? 为什么控制器需要负责渲染模板?
重定向
在成功执行操作后重定向到URL(例如POST/REDIRECT/GET)不必是您的控制器/用例/交互者的关注点,Tinder提供了一个简单的DSL,告诉它如果控制器返回null,则发送重定向响应。
$app->post("/users/{id}", function() { return; }) ->redirect("/users");
如果您使用的是UrlGeneratorServiceProvider
,您发送一个字符串ID和一个可调用对象,该可调用对象必须返回URL生成器的参数。该可调用对象可以使用与常规控制器相同的名称和类型提示语义。
$app->get("/users/{id}", function($id) { }) ->bind("get_user"); $app->post("/users/{id}", function($id) { return; }) ->redirect("get_user", function($id) { return ["id" => $id]; });
如果您不使用生成器,也可以通过使可调用对象生成URL来实现类似的效果。
$app->post("/users/{id}", function($id) { return; }) ->redirect(function($id) { return "/users/$id"; });
事件监听器作为服务
与控制器类似,Tinder包括PimpleAwareEventDispatcher
,允许您将服务配置为事件监听器或订阅者,以便它们可以延迟加载。
<?php $app['dispatcher']->addListenerService('some.event', array('some_service_name', 'someMethod')); $app['dispatcher']->addSubscriberService('some_other_service', 'The\Fully\Qualified\ClassName\Of\That\Service');
为什么?性能。如果您完全采用事件调度器,您的监听器可能很多,它们反过来又可能有很多依赖项。这种方法可以节省在它们实际需要时才加载它们。
README驱动开发
这部分还没有实现,但以下是我想要达到的目标,如果可能的话
<?php require "vendor/autoload.php" $app = new Tinder\Application; $app->post("/user/{user}", "my_controller_as_service:post") ->convert("user", $someKindOfUserConverter) ->enforce("ROLE_ADMIN") // only admins can do this, could be a closure with true/false return or throw ->redirect("get_user", function(User $user) { // on success, go to the get_user url (no idea how I'll do the params yet) // params can be string as url or route name and/or closure for // pre-processing, returning an url if a string param is not present }) ->template("user_edit.html.twig", function(array $data) { // use this template and do some optional data conversion beforehand $data['user'] = new MyApp\Presenter\User($user); return $data; }); $app->get("/some-page", function() {}) ->template("some_page.html.twig") ->cache(["expires" => "tomorrow"]); // http cache until tomorrow
贡献
在修改任何内容之前请与我联系,我根本不知道我可能会做什么,整个库可能自从我上次提交以来已经发生了变化:)
版权
版权(c)2012 Dave Marshall。有关详细信息,请参阅LICENCE