常用命令:
## 安装wenman命令行组件 $ composer require webman/console ## 打印webman版本号 $ php webman version ## 打印当前路由配置 $ php webman route:list ## 创建一个控制器文件 $ php webman make:controller admin #将创建一个 app/controller/AdminController.php $ php webman make:controller api/user #将创建一个 app/api/controller/UserController.php ## 创建一个model文件 $ php webman make:model user $ php webman make:model admin #将创建一个 app/model/Admin.php $ php webman make:model api/user #将创建一个 app/api/model/User.php ## 创建一个中间件文件 $ php webman make:middleware Auth #将创建一个 app/middleware/Auth.php ## 创建自定义命令文件 $ php webman make:command db:config #将创建一个 app\command\DbConfigCommand.php
使用模型,需要安装数据库组件
$ composer require -W webman/database illuminate/pagination illuminate/events symfony/var-dumper
1. 本地新建数据库。数据库名 test. 表名 t_user.
CREATE TABLE `t_user` ( `id` int unsigned NOT NULL AUTO_INCREMENT, `name` varchar(32) COLLATE utf8mb4_general_ci DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
2. 修改数据库配置文件。 config/database.php
<?php return [ 'default' => 'mysql', 'connections' => [ 'mysql' => [ 'driver' => 'mysql', 'host' => '127.0.0.1', 'port' => '3306', 'database' => 'test', 'username' => 'root', 'password' => '', 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_general_ci', 'prefix' => 't_', 'strict' => true, 'engine' => null, 'options' => [ PDO::ATTR_EMULATE_PREPARES => false, // Must be false for Swoole and Swow drivers. ], 'pool' => [ 'max_connections' => 5, 'min_connections' => 1, 'wait_timeout' => 3, 'idle_timeout' => 60, 'heartbeat_interval' => 50, ], ], ], ];
3.修改模型文件。 app/model/User.php
<?php namespace app\model; use support\Model; /** * */ class User extends Model { /** * The connection name for the model. * * @var string|null */ protected $connection = 'mysql'; /** * The table associated with the model. * * @var string */ protected $table = 'user'; /** * The primary key associated with the table. * * @var string */ protected $primaryKey = 'id'; /** * Indicates if the model should be timestamped. * * @var bool */ public $timestamps = false; }
4. 修改控制器。 app/controller/UerController.php
<?php namespace app\controller; use DOMDocument; use support\Db; use support\Log; use support\Request; use support\Response; class UserController { /** * 数据库查询 * * 写入日志 * * 读取配置 */ public function select() { $users = Db::table('user')->get(); Log::info(__CLASS__ . ' log test: '. json_encode($users)); Log::info(__CLASS__ . ' log test2: '. config("session.config.file.save_path")); return json($users); } }
5. 重启服务。
$ php windows.php
6. 访问请求
http://127.0.0.1:8787/user/select
使用中间件
修改 app/middleware/Auth.php 文件
<?php namespace app\middleware; use Webman\MiddlewareInterface; use Webman\Http\Response; use Webman\Http\Request; class Auth implements MiddlewareInterface { public function process(Request $request, callable $handler) : Response { echo '这里是请求穿越阶段,也就是请求处理前'; $response = $handler($request); // 继续向洋葱芯穿越,直至执行控制器得到响应 echo '这里是响应穿出阶段,也就是请求处理后'; return $response; } }
config/route.php
<?php /** * This file is part of webman. * * Licensed under The MIT License * For full copyright and license information, please see the MIT-LICENSE.txt * Redistributions of files must retain the above copyright notice. * * @author walkor<walkor@workerman.net> * @copyright walkor<walkor@workerman.net> * @link http://www.workerman.net/ * @license http://www.opensource.org/licenses/mit-license.php MIT License */ use support\Request; use Webman\Route; Route::any('/user/{name}/{age}', [app\controller\UserController::class, 'route']); // http://127.0.0.1:8787/user/route?name=111&age=10 Route::any('/user/middleMethod', [app\controller\UserController::class, 'middleMethod'])->middleware([app\middleware\Auth::class]); // http://www.webman.com:8787/user/middleMethod //Route::group('/user', function () { // Route::group('/v1', function () { // Route::any('/create', function (Request $request) {return response('create');}); // Route::any('/edit', function (Request $request) {return response('edit');}); // Route::any('/view/{id}', function (Request $request, $id) {return response("view $id");}); // }); //}); Route::group('/blog', function () { Route::any('/create', function (Request $request) {return response('create');}); // http://www.webman.com:8787/blog/create Route::any('/edit', function (Request $request) {return response('edit');}); // http://www.webman.com:8787/blog/edit Route::any('/view/{id}', function (Request $request, $id) {return response("view $id");}); // http://www.webman.com:8787/blog/view/1 }); Route::group('/blog', function () { Route::group('/v2', function () { Route::any('/create', function (Request $request) {return response('create');}); // http://www.webman.com:8787/blog/v2/create Route::any('/edit', function (Request $request) {return response('edit');}); // http://www.webman.com:8787/blog/v2/edit Route::any('/view/{id}', function (Request $request, $id) {return response("view $id");}); // http://www.webman.com:8787/blog/v2/view/1 }); }); Route::fallback(function(){ return json(['code' => 404, 'msg' => '404 not found']); });
app/controller/UserController.php
<?php namespace app\controller; use DOMDocument; use support\Db; use support\Log; use support\Request; use support\Response; class UserController { /** * 数据库查询 * * 写入日志 * * 读取配置 */ public function select() { $users = Db::table('user')->get(); Log::info(__CLASS__ . ' log test: '. json_encode($users)); Log::info(__CLASS__ . ' log test2: '. config("session.config.file.save_path")); return json($users); } public function add() { } public function update() { } public function del() { } /** * http://www.webman.com:8787/user/middleMethod */ public function middleMethod() { return response('hello 111'); } ####################################################################################### /** * http://127.0.0.1:8787/user/route?name=111&age=10 * config/route.php 文件配置路由 Route::any('/user/{name}/{age}', [app\controller\UserController::class, 'route']); */ public function route() { return response(json_encode(input())); } /** * http://www.webman.com:8787/user/route2?name=111&age=10 * 通过GET POST方式传递name和age的值 */ public function route2(string $name, int $age): Response { return json(['name' => $name, 'age' => $age]); } ####################################################################################### // http://www.webman.com:8787/User/index (返回字符串) public function index(Request $request) { return response(json_encode(['class' => __CLASS__, 'base_path' => base_path()])); } // http://www.webman.com:8787/User/hello?name=webman (返回字符串) public function hello(Request $request) { $default_name = 'webman'; // 从get请求里获得name参数,如果没有传递name参数则返回$default_name $name = $request->get('name', $default_name); // 向浏览器返回字符串 return response('hello ' . $name); } // http://www.webman.com:8787/User/json?name=webman (返回json) public function json(Request $request) { $default_name = 'webman'; $name = $request->get('name', $default_name); return json([ 'code' => 0, 'msg' => 'ok', 'data' => $name ]); } // http://www.webman.com:8787/User/xml (返回xml) public function xml(Request $request) { header("Content-Type: text/xml"); $dom = new DOMDocument(); $root = $dom->createElement('data'); $dom->appendChild($root); $name = $dom->createElement('name', 'John Doe'); $root->appendChild($name); $age = $dom->createElement('age', 30); $root->appendChild($age); $dom->formatOutput = true; return $dom->saveXML(); } // http://www.webman.com:8787/User/xml2 (返回xml) public function xml2(Request $request) { $xml = <<<XML <?xml version='1.0' standalone='yes'?> <values> <truevalue>1</truevalue> <falsevalue>0</falsevalue> </values> XML; return xml($xml); } // http://www.webman.com:8787/User/jsonp (返回一个jsonp响应。 ) public function jsonp(Request $request) { return jsonp([ 'code' => 0, 'msg' => 'ok', 'data' => 1111 ]); } // http://www.webman.com:8787/user/view?name=tom (返回一个视图) public function view(Request $request) { $default_name = 'webman'; $name = $request->get('name', $default_name); return view('user/hello', ['name' => $name]); } /** * http://127.0.0.1:8787/user/requestMethod?name=tom * request() 只在请求生命周期内可用;在进程启动阶段或 CLI 任务中不可用。 */ public function requestMethod(Request $request) { // 常用读取 // URL/方法/IP $method = request()->method(); $path = request()->path(); $url = request()->url(); $ip = request()->getRealIp(); return response(json_encode([ 'method'=>$method, 'path'=>$path, 'url'=>$url, 'ip'=>$ip ])); // Query 与表单参数 $id = request()->get('id', 0); // ?id=1 $name = request()->post('name', ''); // POST body (form) $all = request()->all(); // 合并后的请求参数 $only = request()->only(['id','name']); // 指定字段 $except = request()->except(['password']); // Header / Cookie $ua = request()->header('user-agent', ''); $cookie = request()->cookie('sid', ''); // Body / JSON $raw = request()->rawBody(); //$json = request()->json('key', null); // 仅当 Content-Type 为 application/json // 文件上传 $file = request()->file('avatar'); // 单文件 $files = request()->files(); // 所有文件 $tmp = $file->getPathname(); // 临时路径 $origin = $file->getUploadName(); // 原始文件名 // 其他 $scheme = request()->scheme(); // http/https $host = request()->host(); $route = request()->route(); // 当前匹配的路由对象(如需) $session = request()->session(); // 获取 session 对象 return response($method); } /** * http://127.0.0.1:8787/user/inputMethod?name=tom * 助手函数input() * 从post get 的集合中获取某个值。 * * * * 下面用最简明的方式说明 input() 的用法,以及它与 request() 的区别与联系。 * input() 是什么 * 全局助手函数,用于“直接取参数”。等价于从当前请求里取输入参数的便捷方式,常见效果≈ request()->input($key, $default) 或合并后的 get/post/json 参数集合里取值。 * 典型用法: * $id = input('id', 0); // 取单个参数(优先从 Query/Form/JSON 中合并后的集合) * $name = input('user.name'); // 支持点语法(嵌套结构) * $all = input(); // 不传参:返回合并后的所有输入参数数组 * $part = input(['id', 'name']); // 取部分字段(若支持) * request() 是什么 * 全局助手函数,返回当前请求对象 support\Request,可做“任何请求相关操作”,不仅仅是取参数。 * 典型用法: * $r = request(); * $method = $r->method(); * $path = $r->path(); * $ip = $r->getRealIp(); * * $id = $r->get('id', 0); // 仅 Query * $name = $r->post('name', ''); // 仅 Form * $jsonV = $r->json('key', null); // JSON Body * $all = $r->all(); // 合并后的参数 * $file = $r->file('avatar'); // 上传文件 * $ua = $r->header('user-agent');// Header * $cookie = $r->cookie('sid', ''); * * 二者区别一览 * 关注点不同: * input(): 专注“取参数”,一行取值,最省事。 * request(): 获取“请求对象”,能做取参以外的更多事(headers、cookies、files、路由信息等)。 * 返回类型: * input(): 返回具体参数值或数组。 * request(): 返回请求对象,需要再调用方法取值。 * 能力范围: * input(): 只关心输入参数(通常为 Query/Form/JSON 的合并视图)。 * request(): 全量能力(方法、路径、IP、Header、Cookie、文件、Session 等)。 * 语义偏好: * 读参数优先用 input()(更简洁)。 * 需要请求上下文细节时用 request()。 * * 常见场景对照 * 快速取一个参数(带默认值): * $userId = input('user_id', 0); * 需要判断请求方法、再取参数: * if (request()->method() === 'POST') { * $payload = request()->all(); * } * 读取 JSON Body(内容类型为 application/json): * $v = input('key'); // 简洁 * // 或更显式 * $v = request()->json('key'); * 【一句话总结】 * 只“拿参数”用 input();需要“拿更多请求信息/操作”用 request()。 */ public function inputMethod() { //获取参数name $name = input('name'); //获取参数name, 如果不存在则使用默认值 $name2 = input('name','张三'); //获取全部参数 $all_params = input(); return response(json_encode(['name'=>$name,'name2'=>$name2,'all_params'=>$all_params])); } // http://127.0.0.1:8787/user/hello?name=111 (重定向) public function redirectMethod() { return redirect('/user/hello?name=111'); } }
app/model/User.php
<?php namespace app\model; use support\Model; /** * t_user * @property integer $id (主键) * @property string $name */ class User extends Model { /** * The connection name for the model. * * @var string|null */ protected $connection = 'mysql'; /** * The table associated with the model. * * @var string */ protected $table = 'user'; /** * The primary key associated with the table. * * @var string */ protected $primaryKey = 'id'; /** * Indicates if the model should be timestamped. * * @var bool */ public $timestamps = false; }
app/view/user/hello.html
<!doctype html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="shortcut icon" href="/favicon.ico"/> <title>webman</title> </head> <body> hello <?=htmlspecialchars($name)?> </body> </html>
本文为崔凯原创文章,转载无需和我联系,但请注明来自冷暖自知一抹茶ckhttp://www.cksite.cn