此软件包最新版本(v1.0.0)没有可用的许可信息。

为silex提供清洁代码启用器

v1.0.0 2013-05-13 12:47 UTC

This package is auto-updated.

Last update: 2024-09-06 11:03:40 UTC


README

🔥 🔥 使用Silex和Tinder,您的应用程序将燃起 🔥 🔥

Build Status

为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