Slim研读笔记二之造一款Slim应用
来源:互联网 发布:java键盘 上下左右监听 编辑:程序博客网 时间:2024/05/28 14:56
工欲善其事,必先利其器。柚子意图研读Slim框架,若没有一个好的Slim应用,也会显得无从下手。所以,研读第一步是——造一款Slim应用。
具体细节参考自官网http://www.slimphp.net/docs/tutorial/first-app.html。出于柚子自身开发倾向,自制的Slim应用可能会与官方教程略有不同。
在我们即将要创建的Slim应用中,用到了:
- Twig模板引擎
- MonoLog日志管理组件
- 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模板引擎。在后续的文章中,我们会基于该框架进行深入源码的讲解。
- Slim研读笔记二之造一款Slim应用
- Slim研读笔记六之应用主体(上)
- Slim研读笔记六之应用主体(中)
- Slim研读笔记六之应用主体(下)
- Slim研读笔记四之Composer(下)
- Slim研读笔记一之如何读框架
- Slim研读笔记三之Composer(上)
- Slim研读笔记五之依赖注入容器(上)
- Slim研读笔记五之依赖注入容器(中)
- Slim研读笔记五之依赖注入容器(下)
- Slim研读笔记五之依赖注入容器(补)
- Slim研读笔记七乱入篇之Monolog(上)
- Slim研读笔记七乱入篇之Monolog(中)
- Slim研读笔记七乱入篇之Monolog(下)
- Slim研读笔记七之应用程序中间件(上)
- Slim研读笔记七之应用程序中间件(下)
- Slim研读笔记八之路由(上)
- Slim研读笔记七乱入篇之Monolog(补)
- linux汇编学习(2)-----摆脱MBR大小的限制,加载stage2代码
- osip2添加多个不同类型body
- leetCode-Find the Duplicate Number
- Javaweb-Web应用基础
- laravel 课程学习系列四----------------第四章.Laravel中的用户认证(Auth)
- Slim研读笔记二之造一款Slim应用
- 解决mac桌面无法右键的问题
- 浅析 i++ 与 ++i 的区别
- C Primer Plus (第六版)中文版 第七章 编程练习答案
- What's the difference between tf.placeholder and tf.Variable
- 合并的2种方法
- clamav安装
- device_create device_destroy 使用==mknod及通过class_create自动创建设备节点
- 区块链的乡村及涉农应用场景和创新之道——Globalvillage Ecology