mdmunir / dee-app
简单的 PHP 框架
Requires
- php: >=5.4.0
Requires (Dev)
- phpunit/phpunit: 4.8.34
This package is not auto-updated.
Last update: 2024-09-18 19:19:27 UTC
README
PHP MVC 模式框架。适合学习框架工作原理的媒体。
安装
从这里下载文件,然后解压。之后打开命令行,进入解压后的文件夹并运行
php init
特性
- 使用 MVC 模式。
- 使用自动加载。最小化使用
include
和require
。 视图模板
。一些页面可以共享相同的layout
。- 使用 PDO 连接数据库。
- 注册 js 和 css。
- 资产包。
- 清洁 URL。
- 支持 URL 规则/路由。可以用于构建 REST 应用程序。
- 控制台应用程序。
- 以及其他。
使用方法
创建控制器。
在 protected/controllers
文件夹中创建一个名为 Hello.php
的类。
namespace app\controllers; class Hello extends \dee\base\Controller { public function actionIndex() { return $this->render('index', ['name'=>'World']); } }
- 注意大小写。控制器类必须是
dee\base\Controller
类的子类。 - 类名必须与文件名相同,以
.php
结尾。 - 类名使用驼峰命名法(首字母大写)。例如,如果路由是
hello
,则类名为Hello
。如果路由名为hello-guys
,则类名为HelloGuys
。
创建视图。
然后在 protected/views/hello
文件夹中创建一个名为 index.php
的文件。
<div class="hello"> <div class="jumbotron"> <h1>Welcome!</h1> <p class="lead">Hello <?= $name; ?>.</p> <p><a href="https://mdmunir.wordpress.com" class="btn btn-lg btn-success">Get started</a></p> </div> </div>
- 视图文件夹与控制器 ID 一致。
- 如果控制器 ID 是
hello
,则视图位于protected/views/hello
文件夹中。同样,如果控制器 ID 是hello-guys
,则视图位于protected/views/hello-guys
文件夹中。 - 我们还可以在视图中插入 JavaScript 代码。例如
<?php $js = <<<JS $('#click-me').click(function(){ alert('Hello...'); }); JS; $this->registerJs($js); // default di register ke jquery ready. // opsi lainnya adalah $this->registerJs($js,View::POS_HEAD); atau $this->registerJs($js,View::POS_END); $this->title = 'Contoh JS'; ?> <div> <button id="click-me">Click Me</button> </div>
要访问我们创建的页面,URL 是 localhost/path/app/index.php/hello
资产包
可以通过 Asset Package
简单地注册 js 文件。方法是,我们在配置文件中注册我们的包
'components' => [ 'views' => [ 'packages' => [ 'bootstrap' => [ 'js' => ['https://maxcdn.bootstrap.ac.cn/bootstrap/3.3.7/js/bootstrap.min.js'], 'css' => ['https://maxcdn.bootstrap.ac.cn/bootstrap/3.3.7/css/bootstrap.min.css'], 'depends' => ['jquery'], ], ] ] ]
然后,在视图中,我们可以通过注册它来使用该包
/* @var $this \dee\base\View */ $this->registerPackage('bootstrap');
目前可用的核心包是 jquery
,指向 //code.jqueryjs.cn/jquery-2.2.4.min.js
。您可以使用自己的 jQuery,通过修改其配置来实现
'components' => [ 'views' => [ 'packages' => [ ... 'jquery' => [ 'js' => ['@web/main/jquery.min.js'], ], ] ] ]
在 POS_READY
或 POS_LOAD
中注册 JavaScript 时,jquery
包将自动可用。或者,您可以手动注册,通过在视图中调用它 $this->registerPackage('jquery')
。
清洁 URL
要创建更干净的 URL(移除 index.php
),请执行以下步骤。
- 创建文件
.htaccess
。
RewriteEngine on
# RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php
- 更改
showScriptName
设置。打开文件protected/config/web.php
。将showScriptName
更改为false
。
REST URL
可以通过填充 request->rules
设置来创建 REST URL。例如
'rules' => [ 'GET,HEAD product' => 'product/index', 'GET,HEAD product/{id:\d+}' => 'product/view', 'POST product' => 'product/create', 'PUT product/{id:\d+}' => 'product/update', 'DELETE product/{id:\d+}' => 'product/delete', ]
然后我们创建 ProductController
控制器并实现 actionIndex()
、actionView()
等操作。
数据库连接
编辑文件 protected/config/db.php
,然后调整 dsn、用户和密码。例如,连接到 mysql,dsn 为 'mysql:host=localhost;dbname=mydb'。连接建立后,我们可以在控制器中使用它,例如。
public function actionTampil() { $sql = 'select * from user'; $users = Dee::$app->db->queryAll($sql); return $this->render('tampil',['users' => $users]); } // kemudian di view tampil.php <table> <thead> <tr> <th>Id</th> <th>Username</th> <th>Full Name</th> </tr> </thead> <tbody> <?php foreach($users as $user): ?> <tr> <td><?= $user['id']?></td> <td><?= $user['username']?></td> <td><?= $user['fullname']?></td> </tr> <?php endforeach ?> </tbody> </table>
除了直接从控制器访问之外,我们还可以创建模型来处理数据库的输入输出。在 protected/models
文件夹中创建 User.php
文件。
namespace app\models; class User { public function getAll() { $sql = 'select * from user'; return \Dee::$app->db->queryAll($sql); } public function addNew($user) { $sql = 'insert into user(username,fullname) values (:username,:fullname)'; return \Dee::$app->db->execute($sql,[ ':username' => $user['username'], ':fullname' => $user['fullname'], ]); } } // di controller public function actionCreate() { $model = new \app\models\User(); $user = $_POST; $model->addNew($user); }
SQL 构建器
为了方便使用数据库组件,添加了一些功能来简化SQL语句的编写。
Where构造器
$where = [ 'colom1' => 'nilai 1', 'colom2' => [1, 2, 3], "colom3 <> 5", ]; $params = []; $conditions = Dee::$app->db->buildCondition($where, $params); // maka variable $conditions dan $params akan bernilai // $conditions = "(colom1 = :p1) AND (colom2 in (:p2,:p3,:p4)) AND (colom3 <> 5)" // $params = [':p1' => 'nilai 1', ':p2' => 1, ':p3' => 2, ':p4' => 3, ];
Insert构造器
Dee::$app->db->insert('user', [ 'username' => 'mdmunir, 'password' => md5($password), 'company_id' => 1001, ]); // akan memeksekusi sql // INSERT INTO user(username, password, company_id) values(:p1, :p2, :p3); // dengan $params = [':p1' => 'mdmunir', ':p2' => 'md5hash', ':p3' => 1001 ];
Update构造器
Dee::$app->db->update('user', [ 'password' => md5($password), ], ['id' => 1]); // akan memeksekusi sql // UPDATE user SET password = :p1 WHERE (id = :p2); // dengan $params = [':p1' => 'md5hash', ':p2' => 1];
Delete构造器
Dee::$app->db->delete('user', ['id' => 1]); // akan memeksekusi sql // DELETE FROM user WHERE (id = :p1); // dengan $params = [':p1' => 1];
自动加载器
为了确保类能够正确加载,请确保类具有与路径匹配的命名空间。对于位于protected
文件夹下的类,其根命名空间为app
。子命名空间根据该类所在的文件夹来设置。例如,对于位于models文件夹下的类,其命名空间为app\models
。