vespula / slim-skeleton
Requires
- php: >=5.5
- aura/session: ^2.0
- league/climate: ^3.2
- league/plates: ^3.1
- slim/slim: ^3.0
- vespula/auth: ^0.2
- vespula/event: ^1.0
- vespula/locale: ^1.0
- vespula/log: ^0.2
Suggests
- zendframework/zend-permissions-rbac: Role Based Access Control
README
这是一个用于快速开始使用Slim Framework版本3的骨架应用程序。它包含
- Slim Framework,
- 通过League/Plates的模板系统,
- 通过Slim/Flash的会话闪存工具,
- 通过League/CLImate创建项目和控制器命令行界面(CLI),
- 用于显示本地化字符串的本地化库,
- PSR-3日志记录器和
- 认证系统。
目录
设置/安装
- 获取最新的开发版本
composer create-project -s dev vespula/slim-skeleton your/path
- 获取最稳定的版本(不带VCS)
composer create-project vespula/slim-skeleton your/path
- 获取最稳定的版本(带VCS)
composer create-project --keep-vcs vespula\slim-skeleton your/path
- 或者直接克隆或下载仓库,然后运行
composer install
,然后composer run-script post-create-project-cmd
。
如果您选择删除项目的VCS (.git) 信息并使用自己的仓库,请确保修改 .gitignore
文件。默认的配置会忽略 src 文件夹,这可能不是您自己想要的结果。
如果您保留VCS (.git) 信息,则可以将创建的新项目放在 src
文件夹下,并使用它们自己的版本控制。默认情况下,会忽略 src
文件夹。
检查您的 .htaccess 文件
默认设置附带一个 .htaccess 文件,该文件使用 mod_rewrite 对URL进行处理。它将所有请求都指向 index.php。此外,还有一个名为 RewriteBase 的设置,需要正确设置以匹配您的配置。默认情况下,它指向 /slim(例如,如果您在apache中使用别名)。如果项目设置在您的Web服务器的根目录,请取消注释 RewriteBase 设置。如果您使用不同的文件夹名作为别名,请调整 RewriteBase 以匹配您的文件夹。
使用CLI工具创建项目
- 切换到您的 slim-skeleton 文件夹,并运行以下命令
$ ./script/create
- 通过按“p”创建项目,并遵循提示。创建项目时,将创建一个默认的 Index 控制器和关联的视图。
- 在 html/index.php 文件中已创建一个默认的路由。它将指向新创建的控制类和索引方法。
- 完成后,您应该可以浏览到您的文件夹并查看结果。
- 您还可以通过命令行工具创建更多的控制器。像上面一样启动脚本,并选择“c”来创建控制器。
我强烈建议您深入研究代码,以了解系统的工作方式。
创建控制器
在创建项目后,您可以为该项目轻松创建新的控制器。使用 create
脚本创建控制器,确保使用您的项目作为命名空间。
$ ./script/create
- 通过按“c”创建控制器,并遵循提示。
添加路由
创建项目时,将包含一个路由文件。它们将在 /src/YourProject
下的 routes.php
文件中。
您可以将此文件作为创建新路由的示例。如果使用控制器,请记住控制器需要3个参数:一个Interop\Container\ContainerInterface $container
,一个Psr\Http\Message\ServerRequestInterface $request
,以及一个Psr\Http\Message\ResponseInterface $response
。
有关路由的更多信息,请参阅Slim的网站。
日志记录
基本应用程序包含一个PSR-3兼容的日志记录器,您可以替换或删除它。以下是一个简单示例
<?php
$this->log->warning('This is a warning message');
$this->log->info('This is informative');
日志输出数据的位置由您决定。您在依赖文件中定义适配器。查看Vespula/Log文档。
本地化
基本应用程序包含一个输出翻译字符串的库。它不会为您翻译,但会根据您使用的区域设置输出适当的字符串。区域设置对象在依赖文件中进行配置。
<?php
echo $locale->gettext('TEXT_HELLO');
有关设置和使用区域设置类的信息,请参阅其文档。
认证
基本应用程序包含一个轻量级认证库,可以使用PDO对SQL数据库或对Active Directory/LDAP进行用户验证。它还包括一个简单的文本验证适配器用于测试。认证对象在依赖文件中定义。您可以在那里修改设置。有关设置认证对象和不同适配器的所有文档,请参阅Vespula/Auth文档。
首先,您需要设置一些路由来匹配登录请求(一个通过GET,一个通过POST),以及注销请求。在您的项目routes.php
文件中,添加以下内容
<?php
// Replace "Project" with the name of your project
$app->group('/login', function () {
$this->get('', function($request, $response) {
$controller = new \Project\Controllers\Index($this, $request, $response);
return $controller->login();
});
$this->post('', function($request, $response) {
$controller = new \Project\Controllers\Index($this, $request, $response);
return $controller->doLogin();
});
});
$app->get('/logout', function ($request, $response) {
$controller = new \Project\Controllers\Index($this, $request, $response);
return $controller->logout();
});
接下来,您需要在路由中描述的控制器中添加login()
、doLogin()
和logout()
的操作。
<?php
namespace Project\Controllers;
class Index extends Controller {
// ...
public function login()
{
// you should use a csrf strategy here too. Aura Session (included) has csrf tools.
$content = $this->view->render('index/login', ['messages'=>$this->messages]);
return $this->response->write($content);
}
public function doLogin()
{
$username = filter_input(INPUT_POST, 'username', FILTER_SANITIZE_STRING);
$password = filter_input(INPUT_POST, 'password', FILTER_DEFAULT);
$password = strip_tags($password);
$credentials = [
'username'=>$username,
'password'=>$password
];
$this->auth->login($credentials);
if ($this->auth->isValid()) {
$this->setFlash('info', 'You are logged in');
// $this->log->info($username . ' logged in');
return $this->redirect('/');
} else {
$this->setFlash('error', 'bad login');
// $this->log->error($username . ' failed to log in');
return $this->redirect('/login');
}
}
public function logout()
{
$username = $this->auth->getUsername();
$this->auth->logout();
if ($this->auth->isAnon()) {
$this->setFlash('info', 'Goodbye');
// $this->log->info($username . ' logged out');
return $this->redirect('/');
} else {
$this->setFlash('error', 'Could not log you out...');
// $this->log->error($username . ' failed logging out');
return $this->redirect('/');
}
}
}
对于认证状态,可能需要进行一些其他检查。例如,您可能想知道某人是否已经闲置太久,或者他们是否已经超过了会话的过期时间。您可以在基控制器的构造函数中设置这些检查。
if ($this->auth->isIdle()) {
// flash message, etc
}
if ($this->auth->isExpired()) {
// flash some message
}
任何需要检查用户是否有效的时候,只需调用$this->auth->isValid()
。在视图中,您可以调用$auth->isValid()
。
登录模板
您的登录模板index/login.php
在视图文件夹中可能看起来像这样
<?php $this->layout('layouts::' . $theme); ?>
<?php echo $this->alerts($messages); ?>
<?php if ($auth->isValid()) : ?>
<p>You are already logged in! How special for you!</p>
<?php else : ?>
<h2>Login</h2>
<div class="row">
<div class="col-lg-2">
<form action="" method="post">
<div class="form-group">
<label for="username">Username</label>
<input type="text" class="form-control" name="username" id="username" placeholder="Username" />
</div>
<div class="form-group">
<label for="password">Password</label>
<input type="password" class="form-control" name="password" id="password" placeholder="Password" autocomplete="off" />
</div>
<input type="submit" class="btn btn-primary" value="Login" />
</form>
</div>
</div>
<?php endif; ?>
显示警报
基本应用程序捆绑了一个简单的League Plates扩展。任何需要输出主题警报到视图的时候,都可以像调用视图辅助器一样调用它。
警报扩展有4个主题,与Slim骨架提供的布局相匹配。您可以通过传递一个主题作为第二个参数在任何时候指定一个主题,但建议您在定义警报的容器中进行此操作。查看依赖文件。$alerts->setTheme()
。
警报扩展包含以下主题:bootstrap、foundation、gcweb和gcwu。后两个是加拿大政府模板。
<?php
echo $this->info('Some message');
echo $this->error('Some message', $mytheme);
// Echo several at once
$messages = [
'error'=>[
'Error one',
'Error two'
],
'info'=>[
'Info one',
'Info two'
]
];
echo $this->alerts($messages);
故障排除
如果您有任何问题,首先要检查的是
- 您的别名或虚拟主机是否设置正确并指向/slim-skeleton/html文件夹?
- 如果您启用了apache mod_rewrite,请检查html文件夹中的.htaccess,并确保RewriteBase设置正确。默认情况下可能不是这样。