Slim研读笔记二之造一款Slim应用

来源:互联网 发布:java键盘 上下左右监听 编辑:程序博客网 时间:2024/05/28 14:56

工欲善其事,必先利其器。柚子意图研读Slim框架,若没有一个好的Slim应用,也会显得无从下手。所以,研读第一步是——造一款Slim应用。


具体细节参考自官网http://www.slimphp.net/docs/tutorial/first-app.html。出于柚子自身开发倾向,自制的Slim应用可能会与官方教程略有不同。


在我们即将要创建的Slim应用中,用到了:

  1. Twig模板引擎
  2. MonoLog日志管理组件
  3. Eloquent数据库ORM组件
这些都是柚子做项目时经常用到的组件,随着框架研读的进度,我们还会不断增加新的组件。

为方便参考,柚子会具现构建PuHaoran/slimskeleton项目的所有步骤。如果你意图快速创建一个应用程序样板,那可是来对地方啦!


此教程贯穿构建示例应用程序的全流程。如果您不想一步步来,可以直接在 Github 上浏览它的源代码。

git clone git@github.com:PuHaoran/slimskeleton.git


开始为你的项目建立一个文件夹(我的项目叫做yo.slim.cn,你可以取一个你喜爱的名字哦)。我喜欢为不在代码的东西保留最高级别,然后为源代码提供一个文件夹。所以我的初始结构如下所示:


项目完成后的目录结构:




安装Slim框架

Composer是安装Slim Framework的最佳方式。如果你还没有,可以按照安装说明安装。在我的项目中,进入scr目录,执行如下命令进行安装:
composer require slim/slim

要正确设置git,请创建一个名为src/.gitignore的文件,并将以下单行添加到文件中:
vendor/*

现在,git不会提示你将vendor /中的文件添加到存储库中——我们不想这样做的原因是:我们让composer管理这些依赖项,而不是将它们包含在我们的源代码控制库中。


cd yo.slim.cn/src目录,执行 composer require slim/slim



创建应用程序

对于项目主页上的Slim Framework,index.php有一个很好的例子,所以我们将以此为出发点。把下面的代码放到src/public/index.php中:
<?phpuse \Psr\Http\Message\ServerRequestInterface as Request;use \Psr\Http\Message\ResponseInterface as Response;require '../vendor/autoload.php';$app = new \Slim\App;$app->get('/hello/{name}', function (Request $request, Response $response) {    $name = $request->getAttribute('name');    $response->getBody()->write("Hello, $name");    return $response;});$app->run();

我们只是粘贴了一些代码,让我们来看看它的功能。脚本顶部的使用语句只是将Request和Response类引入我们的脚本,所以我们不必通过冗长的名字来引用它们。 Slim框架支持PSR-7,这是HTTP消息传递的PHP标准,所以在构建应用程序时,您会注意到Request和Response对象是您经常看到的东西。这是编写Web应用程序的一种现代而优秀的方法。


使用MonoLog日志组件

composer require monolog/monolog

将依赖项命名为logger,添加它的代码如下所示:
$container['logger'] = function($c) {    $logger = new \Monolog\Logger('my_logger');    $file_handler = new \Monolog\Handler\StreamHandler("../logs/app.log");    $logger->pushHandler($file_handler);    return $logger;};

我们正在向容器中添加一个元素,它本身就是一个匿名函数(传入的$c是容器本身,所以如果需要的话可以访问其他依赖项)。

当我们第一次尝试访问这个依赖关系时会调用它;这里的代码完成了依赖关系的设置。下次我们尝试访问相同的依赖关系时,第一次创建的同一对象将在下次使用。

我的Monolog配置在这里是相当轻的;只需设置应用程序将所有错误记录到名为logs/app.log的文件(请记住,此路径是从index.php脚本运行的角度来设置的)。


使用logger,我可以在我的路由代码中使用这样一行:

$this->logger->addInfo("Something interesting happened");

拥有良好的应用程序日志记录对于任何应用程序都是非常重要的,这样可以根据需要添加尽可能多的或尽可能少的调试信息,并且通过在每条消息中使用适当的日志级别,可以尽可能多地或尽可能少地细化适合您在任何时刻所做的事情。

PS:柚子执行过程中曾出现这样一个错误,根据错误提示可进行修复:

Warning: date_default_timezone_get(): It is not safe to rely on the system's timezone settings. 


这是由于我使用的是php7,不再支持date_default_timezone_get(),所以爆出了这样一条警告,我根据提示进入Logger.php,并修改了源代码。

// static::$timezone = new \DateTimeZone(date_default_timezone_get() ?: 'UTC’);static::$timezone = new \DateTimeZone('UTC');


使用Eloquent数据库组件

您可以使用数据库ORM(如Eloquent)将SlimPHP应用程序连接到数据库。
composer require illuminate/database "~5.1"

将数据库设置添加到Slim的设置数组。
<?phpreturn [    'settings' => [       // Slim Settings        'determineRouteBeforeAppMiddleware' => false,        'displayErrorDetails' => true,        'db' => [            'driver' => 'mysql',            'host' => 'localhost',            'database' => 'database',            'username' => 'user',            'password' => 'password',            'charset'   => 'utf8',            'collation' => 'utf8_unicode_ci',            'prefix'    => '',        ]    ],];

你添加到服务工厂:
// Service factory for the ORM$container['db'] = function ($container) {    $capsule = new \Illuminate\Database\Capsule\Manager;    $capsule->addConnection($container['settings']['db']);    $capsule->setAsGlobal();    $capsule->bootEloquent();    return $capsule;};$app->get('/', function(){        // 日志功能测试        $this->logger->addInfo("发生了一件有趣的事,并把它记录了下来");    // 数据库ORM对象测试        $users = $this->db->table('users')->get();    return "hello world";});


使用Twig模板

Slim没有像传统MVC框架那样的视图层。 相反,Slim的“视图”是HTTP响应。 每个Slim应用程序路径负责准备并返回一个适当的PSR 7响应对象。
// 在容器中注册Twig模板引擎组件$container['view'] = function ($c) {        $view = new \Slim\Views\Twig('../templates', [                'cache' => '../storage/cache’        ]);    // 实例化并添加Slim特定的扩展        $basePath = rtrim(str_ireplace('index.php', '’, $c['request']->getUri()->getBasePath()), '/');        $view->addExtension(new \Slim\Views\TwigExtension($c['router'], $basePath));        return $view;};
这就是说,Slim项目提供了Twig-View和PHP-View组件来帮助您将模板呈现给PSR7 Response对象。

现在,您可以在应用程序路径中使用slim/twig-view组件服务来呈现模板,并将其写入PSR 7 Response对象,如下所示:


// 在路由中渲染Twig模板

$app->get('/hello/{name}', function (    Request $request, Response $response, $args) {            // 将参数name渲染到/templates目录下的index.htm模板        return $this->view->render($response, 'index.htm', [                    'name' => $args['name’]            ]);})->setName('myname');

在Templates/index.htm中渲染
<h2>hello slim!</h2><p>my name is {{ name }}</p>


真不容易啊~现在我们也算完成一套现代PHP框架的全构建流程啦!目前该框架可支持依赖注入,PSR7、MonoLog日志、Eloquent ORM、Twig模板引擎。在后续的文章中,我们会基于该框架进行深入源码的讲解。





阅读全文
0 0
原创粉丝点击