瘦(PHP)筆記
引子
我們需要在短時間內建立一個類似簡單查詢表的東西。
我选择了能够在短时间内创建并具有多个支持服务器的PHP,但我不想使用原生的PHP,所以我尝试了被称为微型框架的Slim,因为我不想选择庞大的框架。
由于我之前稍微使用过 Sinatra,所以在应用程序部分我能够毫不犹豫地使用它。 如果只是制作一个简单的网络应用程序的话,足够使用了。
作曲家
由于我第一次使用Composer,所以我先做个备忘录。
作曲家的准备
最开始是通过Homebrew进行安装的,但是现在可以单独下载安装脚本。
这样可以在部署到服务器时也能使用,所以这样更好。
curl -sS https://getcomposer.org/installer | php
建立composer.json文件
不需要描述必要的软件包。
最近似乎流行一种叫做Twig的视图模板,但我不打算使用它,因为项目规模小,并且设计部分已经用html提供了,这样做太麻烦了。我只需要一个布局文件,所以我选择了使用slim-layout-view。
另外,因为需要发送电子邮件,所以添加了SwiftMailer。
{
"require": {
"slim/slim": "2.*",
"petebrowne/slim-layout-view": "0.3.*",
"swiftmailer/swiftmailer": "@stable"
}
}
安装
听说只要运行安装命令,它会在vendor文件夹中设置所需的内容。
./composer.phar install
只需要require vendor/autoload.php即可使用。
只需要一种选项,以下是用中文进行的意译:
文件结构
据说Slim的情况下,几乎没有任何约束规则,但也不能随意放置,因此适用以下规则。
プロジェクトルート/
composer.json # Composerの構成ファイル
composer.lock # Composerのロックファイル
composer.phar # Composerのインストールスクリプト
public/ # ドキュメントルート
css/ # CSS置き場
img/ # 画像置き場
.htaccess # apacheで配置する場合の設定ファイル
web.config # IISで配置する場合の設定ファイル
index.php # Slimのメインファイル
index.html # トップページ
config.php # 設定ファイル
app/
forms/ # フォームクラス置き場
logs/ # ログの出力先
mail/ # メール送信クラス置き場
templates/ # メールテンプレート置き場
routes/ # ルーティングとアクションの定義
views/ # ビューファイル置き場
layouts/ # レイアウトファイル置き場
vendor/ # Composer経由のライブラリ類インストール先
公共 / 首页.php
在应用程序中的起点。虽然似乎可以只在这个文件中完成,但是为了避免编写每个页面的动作,我决定把它们分割到另一个文件中。好像没有控制器这样的机制,也似乎没有必要做到那个程度,所以只需使用require就可以了。
也许使用某个库会更好地管理会话。
此外,我想要把配置文件提取出来,以便在开发环境和生产环境中进行区分。
配置本身似乎可以在Slim中进行处理,需要进一步调查。
<?php
// タイムゾーンの設定
date_default_timezone_set('Asia/Tokyo');
// 開発用のサーバの場合はデバッグモード
if(preg_match('/Development/', $_SERVER["SERVER_SOFTWARE"])){
define('APPLICATION_ENVIRONMENT', 'development');
define('DEBUG_MODE', true);
}else{
define('APPLICATION_ENVIRONMENT', 'production');
define('DEBUG_MODE', false);
}
require '../vendor/autoload.php';
// ロガーの定義
$today = new DateTime('now', new DateTimeZone("Asia/Tokyo"));
$filepath = sprintf('../app/logs/%s.log', $today->format('Y-m-d'));
$logWriter = new \Slim\logWriter(fopen($filepath, 'a'));
// アプリケーションの作成
$app = new \Slim\Slim(array(
"debug" => DEBUG_MODE,
'mode' => APPLICATION_ENVIRONMENT,
"templates.path" => "../app/views",
'view' => '\Slim\LayoutView',
'layout' => 'layouts/main.phtml',
'log.writer' => $logWriter
));
session_start();
// ルーティングファイルの読み込み
require '../app/routes/index.php';
require '../app/routes/inquiry.php';
// アプリケーションの実行
$app->run();
应用/路由/询问.php
通过分割的路由和操作描述。简单地使用$app。
尽管在开头进行了require,但是否可以通过autoload来实现呢?
<?php
require_once '../app/forms/inquiry.php';
require_once '../app/mail/inquiry.php';
require_once '../app/mail/inquiry_confirmation.php';
// 入力
$app->get('/inquiry', function() use ($app){
$params = $app->request->post();
$form = new \Forms\Inquiry();
if(count($params) > 0){
$form->validate($params);
}
$app->render('inquiry/index.phtml', array(
'form' => $form
));
});
应用/表格/查询.php
只是简单地进行输入值的验证和错误消息的管理。
<?php
namespace Forms;
class Inquiry
{
private $_values = array();
private $_errors = array();
public function __construct()
{
}
public function validate($values)
{
$this->_errors = array();
$this->setValue('last_name', $this-> nullOrValue($values, 'last_name'));
if ($this->getValue('last_name') == '') {
$this->addMessage('last_name', '姓は必須項目です。');
}
return count($this->_errors) <= 0;
}
public function getMessages()
{
return $this->_errors;
}
public function getErrorCount()
{
return count($this->_errors);
}
public function addMessage($name, $message)
{
$this->_errors[$name] = $message;
}
public function getMessage($name)
{
return $this->null_or_value($this->_errors, $name);
}
public function setValue($name, $value)
{
$this->_values[$name] = $value;
}
public function getValue($name)
{
return $this->null_or_value($this->_values, $name);
}
private function nullOrValue($params, $key)
{
return isset($params[$key]) ? $params[$key] : null;
}
}
应用/邮件/咨询.php
邮件发送类。邮件正文通过读取放在mail/templates文件夹中的文件,以PHP的形式创建。
与邮件发送相关的信息由Slim框架的config持有。
<?php
namespace Mail;
class Inquiry
{
private $_form;
private $_app;
public function __construct($form, $app)
{
$this->_form = $form;
$this->_app = $app;
}
protected function getForm()
{
return $this->_form;
}
protected function getApplication()
{
return $this->_app;
}
public function getMailTo()
{
return $this->getApplication()->config('mail_to');
}
public function getMailFrom()
{
return $this->getApplication()->config('mail_from');
}
public function getSubject()
{
return $this->getApplication()->config('mail_subject');
}
public function getTransport()
{
$mailer = \Swift_SmtpTransport::newInstance($this->getApplication()->config('smtp_host'), $this->getApplication()->config('smtp_port'));
// アカウントの指定が有る場合
if($this->getApplication()->config('smtp_user')){
$mailer->setUsername($this->getApplication()->config('smtp_user'));
$mailer->setPassword($this->getApplication()->config('smtp_password'));
}
return $mailer;
}
public function send()
{
$transport = $this->getTransport();
// メーラーの作成
$mailer = \Swift_Mailer::newInstance($transport);
// 送信ログ
$this->getApplication()->getLog()->info($this->getBody());
// メッセージ作成
$message = \Swift_Message::newInstance()
->setSubject($this->getSubject())
->setTo($this->getMailTo())
->setFrom($this->getMailFrom())
->setBody($this->getBody());
$mailer->send($message);
}
public function getBody()
{
$form = $this->getForm();
// テンプレートファイルの読み込み(PHP)
$content = file_get_contents('../app/mail/templates/inquiry.php');
eval('$result = "' . $content . '";');
return $result;
}
}
应用程序的配置文件是 app/config.php。
根据传给Slim的模式来描述应用程序的设置值。对于每个环境,进行相应的配置设置。在开发环境中,我们使用mailcatcher,因此SMTP配置也相应地调整。
<?php
// メールタイトル
$app->config('mail_subject', '問い合わせ');
// 開発
$app->configureMode('development', function() use ($app) {
$app->config('log.level', Slim\Log::DEBUG);
// STMPサーバ
$app->config('smtp_host', '127.0.0.1');
$app->config('smtp_port', '1025');
// メール送信先
$app->config('mail_to', 'hoge@fuga.com');
// メール送信元
$app->config('mail_from', array('hoge@fuga.com' => 'piyo'));
});
// 本番
$app->configureMode('production', function() use ($app) {
$app->config('log.level', \Slim\Log::INFO);
// STMPサーバ
$app->config('smtp_host', '127.0.0.1');
$app->config('smtp_port', '587');
// メール送信先
$app->config('mail_to', 'hoge@fuga.com');
// メール送信元
$app->config('mail_from', array('hoge@fuga.com' => 'piyo'));
});
关于视图
由于视图部分只是基于HTML的PHP脚本,因此可以忽略掉。
请提供以下内容的本地化中文释义,只需提供一个选项:
“The weather forecast predicts rain tomorrow.”
在中国,将以下内容进行本地化转述,只需提供一种选择:
在Qiita上认真考虑引入PHP组件管理工具composer
使用轻量级的PHP框架slim创建一个简单的应用程序 – Qiita