瘦(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

广告
将在 10 秒后关闭
bannerAds