本日、在庫管理システムSASO2.4がリリースされました。
以下のリンクからお越しください。
在庫管理システムSASO2.4
フリーロケーションのシンプルな在庫管理システムSASO
bootstrap5を使ったクールなデザイン。
クリーンアーキテクチャとモナドによる美しく※1、そして透明感※2のあるコード。
それが今、あなたの手に。
※1 当店比。
※2 参照透過性のこと。
21世紀のライフスタイルに合った新しい装束 ―
日本標準機構では、日本の装束をカジュアルにアレンジして販売しています。
狩衣(かりぎぬ)、直衣(のうし)、直垂(ひたたれ)などを現代のライフスタイルに合わせてより着やすく、よりカジュアルに。
カジュアル装束の販売は
日本標準機構
本日、在庫管理システムSASO2.4がリリースされました。
以下のリンクからお越しください。
在庫管理システムSASO2.4
フリーロケーションのシンプルな在庫管理システムSASO
bootstrap5を使ったクールなデザイン。
クリーンアーキテクチャとモナドによる美しく※1、そして透明感※2のあるコード。
それが今、あなたの手に。
※1 当店比。
※2 参照透過性のこと。
<?php
namespace saso\classes\controllers;
use \saso\classes\base;
class ControllerBase{
private $_title;
private $_content;
private $_errorMessage;
private function _linkTo($path){
return 'http://' . $_SERVER['HTTP_HOST'] . '/' . PROGRAM_DIR . '/' . $path;
}
private function _getContentTitle() {
return $this->_title;
}
private function _getContent() {
return $this->_content;
}
protected function _setContentTitle($title) {
$this->_title = $title;
}
protected function _setCurrentContent($current) {
require_once 'logic/' . $this->_controllerName . '/' . $current.'.php';
$this->_content = 'view/' . $this->_controllerName . '/' . $current.'.php';
require_once 'view/temp.php';
}
protected function _invalidAccess(){
$postTest = new base\Post();
$nameTest = new base\Request($postTest);
if(is_null($nameTest->getRequest())){
header('Location: http://'.$_SERVER['HTTP_HOST'] . '/' . PROGRAM_DIR . '/' . $this->_controllerName . '/start/',TRUE,'303');
}
}
public function error($errorCode){
switch($errorCode){
case 'database':
$this->_errorMessage = 'データベースに接続できませんでした。';
break;
case 'invalid':
$this->_errorMessage = '入力値が不正です。';
break;
case 'notFound':
$this->_errorMessage = 'ページが見つかりません。';
break;
case 'invalidClone':
$this->_errorMessage = 'クローンは使えません。';
break;
default:
$this->_errorMessage = '予期せぬエラーが発生しました。';
break;
}
$this->_title = 'エラー';
$this->_content = 'view/error.php';
require_once 'view/temp.php';
}
}
<?php
namespace saso\classes\controllers;
class ItemController extends ControllerBase{
protected $_controllerName = 'item';
public function startAction(){
$this->_setContentTitle('商品管理');
$this->_setCurrentContent('start');
}
//商品登録
public function addItemAction(){
$this->_setContentTitle('商品登録');
$this->_setCurrentContent('addItem');
}
public function addItemConfirmAction(){
$this->_invalidAccess();
$this->_setContentTitle('登録確認');
$this->_setCurrentContent('addItemConfirm');
}
public function addItemSaveAction(){
$this->_invalidAccess();
$this->_setContentTitle('登録完了');
$this->_setCurrentContent('addItemSave');
}
}
<?php
namespace saso\classes\base;
interface RequestInterface{
function setValues();
}
それを実装したものが以下の二つです。<?php
namespace saso\classes\base;
class Post implements RequestInterface{
private $_values;
public function setValues(){
foreach($_POST as $key => $value){
$value = htmlspecialchars($value, ENT_QUOTES, 'UTF-8');
$this->_values[$key] = $value;
}
return $this->_values;
}
}
<?php
namespace saso\classes\base;
class UrlParameter implements RequestInterface{
private $_values;
public function setValues(){
foreach($_GET as $key => $value){
$this->_values[$key] = $value;
}
return $this->_values;
}
}
Requestクラスはコンストラクタでインターフェースをタイプヒンティングしています。<?php
namespace saso\classes\base;
class Request{
private $_request;
public function __construct(RequestInterface $r){
$this->_request = $r->setValues();
}
private function _hasKey($key){
if(false == array_key_exists($key,$this->_request)){
return false;
}
return true;
}
public function getRequest($key = null){
if(null == $key){
return $this->_request;
}//キーを指定されなかったら、全部を配列で返す。
if(false == $this->_hasKey($key)){
return null;
}//言われたキーがない場合nullを返す
return $this->_request[$key];//普通は言われたキーのヴァリューを返す
}
}
使い方は以下の通りです。<?php
$post = new base\Post();
$name = new base\Request($post);
echo $name->getRequest('itemName');
<?php
namespace saso\classes\base;
class Dispatcher{
private $_sysRoot;
public function setSystemRoot($path){
$this->_sysRoot = rtrim($path, '/');
}
public function dispatch(){
$param = ereg_replace('/?$', '', $_SERVER['REQUEST_URI']);
$param = ereg_replace(PROGRAM_DIR, '', $param);
$param = ereg_replace('^/*', '', $param);
$params = array();
if('' != $param){
$params = explode('/', $param);
}
//_GET(UrlParameter用)
$_GET[0] = '';
if(2 < count($params)){
for($i = 0; $i < count($params) - 2; $i++){
$_GET[$i] = $params[$i+2];
}
}
//controller
if(isset($params[0]) && 'start' == $params[0] && 'start' == $params[1]){
header('Location: http://'.$_SERVER['HTTP_HOST'] . '/' . PROGRAM_DIR . '/',TRUE,'301');
}
$controller = 'start';
if(0 < count($params)){
$controller = $params[0];
}
$className = ucfirst(strtolower($controller)) . 'Controller';
$className = '\\saso\\classes\\controllers\\' . $className;
try{
$controllerInstance = new $className();
}catch(\Exception $e){
$ctrlbase = new \saso\classes\controllers\ControllerBase();
$ctrlbase->error($e->getMessage());
die();
}
//action
if(isset($params[0]) && !isset($params[1])){
header('Location: http://'.$_SERVER['HTTP_HOST'] . '/' . PROGRAM_DIR . '/' . $controller . '/start/',TRUE,'301');
}
$action = 'start';
if(1 < count($params)){
$action = $params[1];
}
$actionMethod = $action . 'Action';
try{
if(!method_exists($controllerInstance, $actionMethod)){
throw new \Exception('notFound');
}
$controllerInstance->$actionMethod();
}catch(\Exception $e){
$ctrlbase = new \saso\classes\controllers\ControllerBase();
$ctrlbase->error($e->getMessage());
die();
}
}
}
<?php use \saso\classes\base; require_once 'config.php'; require_once 'autoload.php'; $dispatcher = new base\Dispatcher(); $dispatcher->setSystemRoot(DOCUMENT_ROOT . PROGRAM_DIR); $dispatcher->dispatch();
<?php
function __autoload($classname) {
$classname = ltrim($classname, '\\');
$filename = '';
$namespace = '';
if ($lastnspos = strripos($classname, '\\')) {
$namespace = substr($classname, 0, $lastnspos);
$classname = substr($classname, $lastnspos + 1);
$firstnspos = stripos($namespace, '\\');
$namespace = substr($namespace, $firstnspos + 1);
$filename = DOCUMENT_ROOT . PROGRAM_DIR . '/' . str_replace('\\', '/', $namespace) . '/';
}
$filename .= $classname . '.php';
if(!file_exists($filename)){
throw new \Exception('notFound');
}
require $filename;
}
<?php
const
//パス
DOCUMENT_ROOT = '/***/***/public_html/'
,PROGRAM_DIR = 'saso1_0'
//データベース
,DSN = 'mysql:dbname=saso;host=localhost'
,USER = 'saso_user'
,PASSWORD= '**********'
;
<?php
namespace saso\classes\base;
class PdoManager{
private static $_pdo;
private function __construct() {
try{
self::$_pdo = new \PDO(
DSN,
USER,
PASSWORD,
array(
\PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION,
\PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_CLASS,
)
);
self::$_pdo->exec('SET NAMES utf8');
}catch (\PDOException $e){
$ctrlbase = new \saso\classes\controllers\ControllerBase();
$ctrlbase->error('database');
die();
}
}
public static function getPdo() {
new PdoManager();
return self::$_pdo;
}
public final function __clone() {
throw new \Exception('invalidClone');
}
}
以下のように使います:$pdo = saso\classes\base\PdoManager::getPdo();
$pdo->query('内容');
<?php
$size = array('Sサイズ', 'Mサイズ', 'Lサイズ');
foreach($size as $key => $value){
echo $value;
if(count($size)-1 != $key ){
echo "、";
}
}
?>
<?php
$size = array('Sサイズ', 'Mサイズ', 'Lサイズ');
foreach($size as $key => $value){
echo $value;
if(count($size)-1 == $key ){
echo "。";
}
}
?>
class Tomjr extends Tom {
protected static $sentence="私はTomjr";
public function foo(){
$this->bar();
}
}
class Tom {
protected static $sentence="私はTom";
public function bar(){
echo static::$sentence;//親クラスが子クラスの静的プロパティ・メンバを呼ぶときに使う
}
}
$tomjr = new Tomjr();
$tomjr->foo();//結果:私はTomjr
$tom = new Tom();
$tom->bar();//結果:私はTom