1. 程式人生 > >Phalcon搭建多模組框架十:註冊資料庫服務及模型簡單增刪改查

Phalcon搭建多模組框架十:註冊資料庫服務及模型簡單增刪改查

首先建立一個數據庫phalcon,然後建立一張表做測試。

CREATE TABLE `ph_robots` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(70) NOT NULL,
  `type` tinyint(1) NOT NULL,
  `weight` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

這裡寫圖片描述
1、開啟config/config.php
新增資料庫配置

'db' => [
    'host' => 'localhost',
    'port' => 3306,
    'username' => 'root',
    'password' => '123456',
    'dbname' => 'phalcon',
    'charset' => 'utf8'
],

完整的config/config.php

<?php
/**
 * @desc 全域性配置檔案
 * @author zhaoyang
 * @date 2018年5月3日 下午7:54:47
 */
return [
    // 服務配置
'services' => [ // mysql資料庫配置 'db' => [ 'host' => 'localhost', 'port' => 3306, 'username' => 'root', 'password' => '123456', 'dbname' => 'phalcon', 'charset' => 'utf8' ], // 排程器配置
'dispatcher' => [ // 處理 Not-Found錯誤配置 'notfound' => [ // 錯誤碼及錯誤提示(ajax和post請求) 'status_code' => 404, 'message' => 'Not Found', // 錯誤跳轉的頁面 'namespace' => DEFAULT_MODULE_NAMESPACE . '\\Controllers', 'controller' => 'error', 'action' => 'error404' ], ], // volt引擎相關配置 'view_engine_volt' => [ // 編譯模板目錄 'compiled_path' => BASE_PATH . 'runtime/' . DEFAULT_MODULE . '/compiled/volt' . DS, // 是否實時編譯 'compile_always' => false, // 附加到已編譯的PHP檔案的副檔名 'compiled_extension' => '.php', // 使用這個替換目錄分隔符 'compiled_separator' => '%%', // 是否要檢查在模板檔案和它的編譯路徑之間是否存在差異 'stat' => true, // 模板字首 'prefix' => '', // 支援HTML的全域性自動轉義 'autoescape' => false ], // 模板相關配置 'view' => [ // 模板字尾 'view_suffix' => 'volt,phtml', // 模板路徑 'view_path' => APP_PATH . DEFAULT_MODULE . '/views' . DS, // 模板引擎,暫時支援viewEngineVolt or viewEnginePhp,與模板字尾一一對應 'view_service' => 'viewEngineVolt,viewEnginePhp', ], // 過濾器設定 'filter' => [ // 過濾型別,支援string、trim、absint、int、email、float、int!、float!、alphanum、striptags、lower、upper、url、special_chars 'default_filter' => 'string,trim' ], ], ];

2、開啟config/services.php
註冊資料庫服務元件

use Phalcon\Db\Adapter\Pdo\Mysql;

$di->setShared('db', function () {
    $dbConfig = $this->getConfig()->services->db->toArray();
    $mysql = new Mysql($dbConfig);
    return $mysql;
});

完整的config/services.php

<?php
/**
 * @desc 註冊服務
 * @author zhaoyang
 * @date 2018年5月3日 下午8:01:34
 */

use Common\Common;
use Common\Validate;
use Library\Extensions\VoltExtension;
use Library\Plugins\DIspatcherPlugin;
use Phalcon\Config;
use Phalcon\Db\Adapter\Pdo\Mysql;
use Phalcon\DI;
use Phalcon\Di\FactoryDefault;
use Phalcon\Events\Manager as EventsManager;
use Phalcon\Mvc\Dispatcher;
use Phalcon\Mvc\Router;
use Phalcon\Mvc\View;
use Phalcon\Mvc\View\Engine\Volt as ViewEngineVolt;
use Phalcon\Mvc\View\Engine\Php as ViewEnginePhp;

$di = new FactoryDefault();

/**
 * @desc 註冊排程器服務
 * @author zhaoyang
 * @date 2018年5月3日 下午8:38:34
 */
$di->setShared('dispatcher', function () {
    $config = $this->getConfig();
    $dispatcher = new Dispatcher();
    $defaultNamespace = $config->module_default_namespaces ?? DEFAULT_MODULE_NAMESPACE . '\\Controllers';
    $dispatcher->setDefaultNamespace($defaultNamespace);
    $eventsManager = new EventsManager();
    $eventsManager->attach('dispatch', new DIspatcherPlugin());
    $dispatcher->setEventsManager($eventsManager);
    return $dispatcher;
});

/**
 * @desc 註冊配置服務
 * @author zhaoyang
 * @date 2018年5月3日 下午8:38:53
 */
$di->setShared('config', function () use ($config) {
    return new Config($config);
});

/**
 * @desc 註冊路由服務
 * @author zhaoyang
 * @date 2018年5月3日 下午8:39:06
 */
$di->setShared('router', function () use ($routerRules) {
    $router = new Router();
    // 自動刪除末尾斜線
    $router->removeExtraSlashes(true);
    foreach ($routerRules as $k => $v) {
        $router->add($k, $v);
    }
    return $router;
});

/**
 * @desc 註冊檢視引擎volt服務
 * @author zhaoyang
 * @date 2018年5月4日 下午5:28:52
 */
$di->setShared('viewEngineVolt', function (View $view, DI $di) {
    // 獲取config服務有多種方法,這是其一
    $voltConfig = $di->get('config')->services->view_engine_volt->toArray();
    $voltConfig = Common::convertArrKeyUnderline($voltConfig);
    $viewEngineVolt = new ViewEngineVolt($view, $di);
    $voltConfig['compiledPath'] = isset($voltConfig['compiledPath']) ? Common::dirFormat($voltConfig['compiledPath']) : BASE_PATH . 'runtime/' . DEFAULT_MODULE . '/compiled/volt' . DS;
    $mkdirRes = Common::mkdir($voltConfig['compiledPath']);
    if (!$mkdirRes) {
        throw new \Exception('建立目錄 ' . $voltConfig['compiledPath'] . ' 失敗');
    }
    $viewEngineVolt->setOptions($voltConfig);
    // 獲取編譯器物件
    $compiler = $viewEngineVolt->getCompiler();
    // 新增擴充套件
    $compiler->addExtension(new VoltExtension());
    return $viewEngineVolt;
});

/**
 * @desc 註冊檢視引擎php服務
 * @author zhaoyang
 * @date 2018年5月4日 下午5:29:15
 */
$di->setShared('viewEnginePhp', function (View $view, DI $di) {
    $viewEnginePhp = new ViewEnginePhp($view, $di);
    return $viewEnginePhp;
});

/**
 * @desc 註冊檢視服務
 * @author zhaoyang
 * @date 2018年5月3日 下午10:52:37
 */
$di->set('view', function () {
    // 獲取config服務有多種方法,這是其二
    $viewConfig = $this->getConfig()->services->view;
    $viewDir = $viewConfig->view_path ?? APP_PATH . DEFAULT_MODULE . '/views' . DS;
    if (isset($viewConfig->view_suffix)) {
        $viewSuffixs = explode(',', $viewConfig->view_suffix);
    } else {
        $viewSuffixs = [ 
            'volt'
        ];
    }
    if (isset($viewConfig->view_service)) {
        $viewServices = explode(',', $viewConfig->view_service);
    } else {
        $viewServices = [ 
            'viewEngineVolt'
        ];
    }
    $engines = [ ];
    foreach ($viewSuffixs as $k => $v) {
        $suffix = '.' . ltrim($v, '.');
        $engines[$suffix] = $viewServices[$k] ?? $viewServices[0];
    }
    $view = new View();
    // 設定檢視路徑
    $view->setViewsDir($viewDir);
    // 註冊檢視引擎
    $view->registerEngines($engines);
    // 如果不需要“生成顯示到控制器佈局”和“生成顯示到主佈局”,則關閉這兩個渲染級別
    $view->disableLevel([ 
        View::LEVEL_LAYOUT => true,
        View::LEVEL_MAIN_LAYOUT => true
    ]);
    return $view;
});

/** 
 * @desc 註冊驗證服務 
 * @author zhaoyang 
 * @date 2018年5月11日 下午7:26:30 
 */
$di->set('validate', function () {
    $validate = new Validate();
    return $validate;
});

/** 
 * @desc 註冊資料庫服務 
 * @author zhaoyang 
 * @date 2018年5月14日 下午9:01:36 
 */
$di->setShared('db', function () {
    $dbConfig = $this->getConfig()->services->db->toArray();
    $mysql = new Mysql($dbConfig);
    return $mysql;
});

至此已經配置完成,下面開始測試
3、在app/home/models下建立Robots.php模型檔案

<?php
namespace App\Home\Models;

use Phalcon\Mvc\Model;

class Robots extends Model {

    public function initialize(){
        $this->setSource('ph_robots'); 
    }
}

4、在home模組新增RobotsController.php控制器

<?php
/**
 * @desc 主頁
 * @author zhaoyang
 * @date 2018年3月23日 上午10:11:38
 */
namespace App\Home\Controllers;

use Common\BaseController;
use App\Home\Models\Robots;

class RobotsController extends BaseController {

    public function indexAction() {
        $robotsList = Robots::find();
        foreach ($robotsList as $robot){
            echo $robot->id,' ',$robot->name,' ',$robot->type,' ',$robot->weight,'<br/>';
        }
    }

    public function addAction() {
        $data = $this->get();
        $robots = new Robots();
        $res = $robots->create($data); // or save($data)
        var_dump($res, $robots->id ?? '插入失敗', $robots->getMessages());exit;
    }

    public function infoAction() {
        $id = $this->get('id', 'int');
        $robot = Robots::findFirst($id);
        echo $robot->id,' ',$robot->name,' ',$robot->type,' ',$robot->weight;exit;
    }

    public function editAction() {
        $data = $this->get();
        $robot = Robots::findFirst($data['id']);
        $res = $robot->update($data); // or save($data)
        var_dump($res, $res ? '更新成功' : '更新失敗', $robot->getMessages());exit;
    }

    public function deleteAction() {
        $id = $this->get('id', 'int');
        $robot = Robots::findFirst($id);
        $res = $robot->delete();
        var_dump($res, $res ? '刪除成功' : '刪除失敗', $robot->getMessages());exit;
    }
}

訪問/robots/add/name/robot_one/type/1/weight/13
這裡寫圖片描述
資料庫:
這裡寫圖片描述
訪問/robots/index
這裡寫圖片描述
訪問robots/info
這裡寫圖片描述
訪問/robots/edit/id/1/type/2
這裡寫圖片描述
資料庫:
這裡寫圖片描述
訪問/robots/delete/id/1
這裡寫圖片描述