本次简述一下如何快速入手一款新的php框架
本次示例框架 laravel 5.1
遇到一款不太熟悉的php框架,我们首先从原理出发
目前市面上 基本都是 MVC 型的
我们的思维结构大致如下
命名空间与路由规则
Controller 层
Model 层
View 层
框架自带特性
如何引入自定义的库呢?你可以通过写一个用于引入三方文件的函数
比如 laravel 引入一个 相对于根目录的文件
require base_path('Lib/Mine/Translate.php');
当然,这里laravel常用composer来进行 引入第三方类库
命名空间 app表示应用程序目录,其命名空间以 PSR-4 来规范 如 Controller 一般命名空间为
App\Http\Controllers
位置大致如下
依据手册,找到路由分配相关
这里 laravel 采用的是 类似 java 里面的 map 映射
即,每个url需要自己去配置,它映射到哪个控制器的哪个方法
文件位置 app/Http/Controllers/routes.php
<?php
// 显示某篇文章
Route::get( //这里的请求方法可以是 get、post、put、delete...以满足不同的场景
'/article/{id}',
'ArticleController@show' // 映射到 Article控制器的 show方法里面去
);
一般我们把Controller写在目录 app/Http/Controllers/ 下
示例写一个 ArticleController ,继承一下框架自带的控制器即可
文件位置 app/Http/Controllers/ArticleController.php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Requests;
use App\Http\Controllers\Controller;
class IndexController extends Controller
{
/**
* Display the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function show($id)
{
echo 'This id is '. $id;
}
}
站内浏览器访问路由
GET /article/2017
输出结果如下
This id is 2017
模型允许你在表中进行数据查询,以及插入、更新、删除等操作
老样子,你继承一下框架自带的模型并完成一下初始配置即可
文件位置 app/Article.php
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Article extends Model{
/**
* 关联到模型的数据表
* @var string
*/
protected $table = 'blog_text';
}
在 laravel 框架中 [当然,你的逻辑也可以直接写在model中,只是不利于单元测试时的解耦]
我们的逻辑目录在 App\Repositories 下
在 BaseRepository.php 我们可以清楚的看见这就是为CURD操作 提供便利的解决多继承的 trait
其中封装了 CURD 、分页等常用操作 [这次我们使用的是其中的getById($id)方法]
假设我们现在这个逻辑的目的为:取出文章的标题
那么 ArticleRepository.php 写法如下
<?php
namespace App\Repositories;
use App\Article;
class ArticleRepository{
use BaseRepository;
protected $model; // 首先要实例化一个 model变量,后面才能基于BaseRepository类进行操作
public function __construct(Article $article){
$this->model = $article;
}
}
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Requests;
use App\Repositories\ArticleRepository;
use App\Http\Controllers\Controller;
class ArticleController extends Controller{
protected $article;
public function __construct(ArticleRepository $article){
$this->article = $article;
}
/**
* Display the specified resource.
* @param int $id
* @return \Illuminate\Http\Response
*/
public function show($id){
// 通过主键获取单个模型...
$info = $this->article->getById($id);
return view('article.index',[ 'article_info' => $info ]);
}
}
这里我们看当前框架手册就行了
laravel 5.1 把模板基本都放在 resources目录下的
控制器输出模板的时候,为了方便单元测试 通过return的方式输出渲染后的视图
如,刚刚控制器中的这行
return view('article.index',[ 'article_info' => $info ]);
表示的就是根目录下,这个位置的文件
文件位置 resources/article/index.blade.php
<ul>
<li> ID: {{$article_info->id}} </li>
<li> 文章标题: {{$article_info->title}} </li>
</ul>
目前,你已经大致了解了它MVC或者多层MVC的机制了
接下来就是该框架的特色了
比如 laravel 5.1 相比其他框架,它多了一个叫做中间件的东西、事件监听、队列等等
HTTP中间件提供了一个便利的机制来过滤进入应用的HTTP请求
Laravel框架内置了一些中间件,包括维护模式中间件、认证、CSRF保护中间件等等
所有的中间件都位于app/Http/Middleware目录
例如,Laravel包含了一个中间件来验证用户是否经过授权,如果用户没有经过授权,中间件会将用户重定向到登录页面,否则如果用户经过授权,中间件就会允许请求继续往前进入下一步操作
详见 官网示例
待更新
Laravel 报错都是报的异常,并不会报语法错误之类的只会抛出异常,通常我们需要去捕获异常
try {
// 业务逻辑
} catch (Exception $exception) {
\Log::info('xx业务,异常:', [
'message' => $exception->getMessage(),
'line' => $exception->getLine(),
'file' => $exception->getFile(),
]);
}
如果写接口的时候,我们也需要通过try catch方法返回信息的话,我们可以更加细化一下错误信息的抓取
try {
// 业务逻辑
// ...
// 当业务逻辑不通,正常返回错误信息
throw new OrdinaryException($error_message, $error_code);
} catch (OrdinaryException $exception) {
// OrdinaryException 继承自 Exception
// 获取异常编号
$error_code = $exception->getCode();
if( $exception->getMessage() == null ){
// 如果是临时书写的异常错误
return Myresponse::error($error_code, $exception->getMessage());
}else{
// 如果是定义对应错误编号的,
return Myresponse::error($error_code);
}
} catch (Exception $exception) {
\Log::info('代码错误信息,异常:', [
'message' => $exception->getMessage(),
'line' => $exception->getLine(),
'file' => $exception->getFile(),
]);
return Myresponse::error(500, '服务器内部错误');
}
Myresponse
类的封装类似 这里
评论列表点此评论