云天河教你快速入手一款php框架

2017-07-16 14:40:36 PHP 3568 4

本次简述一下如何快速入手一款新的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需要自己去配置,它映射到哪个控制器的哪个方法

routes.php

文件位置 app/Http/Controllers/routes.php

<?php
// 显示某篇文章
Route::get( //这里的请求方法可以是 get、post、put、delete...以满足不同的场景
    '/article/{id}',  
    'ArticleController@show' // 映射到 Article控制器的 show方法里面去
);

Controller 层

一般我们把Controller写在目录 app/Http/Controllers/ 下
示例写一个 ArticleController ,继承一下框架自带的控制器即可

ArticleController.php

文件位置 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

Model 层

模型允许你在表中进行数据查询,以及插入、更新、删除等操作
老样子,你继承一下框架自带的模型并完成一下初始配置即可

Article.php

文件位置 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;
    }
}
修改后的ArticleController.php
<?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  ]);
    }
}

View 层

这里我们看当前框架手册就行了
laravel 5.1 把模板基本都放在 resources目录下的
控制器输出模板的时候,为了方便单元测试 通过return的方式输出渲染后的视图 如,刚刚控制器中的这行

return view('article.index',[ 'article_info' => $info  ]);

表示的就是根目录下,这个位置的文件

index.blade.php

文件位置 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类的封装类似 这里

注:若无特殊说明,文章均为云天河原创,请尊重作者劳动成果,转载前请一定要注明出处