laravel框架应用和composer扩展包开发

laravel5.5+


laravel官方地址php

laravel是目前最流行的php框架,发展势头迅猛,应用很是普遍,有丰富的扩展包能够应付你能想到的各类应用场景,laravel框架思想前卫,跟随时代潮流,提倡优雅代码,自称为“web工匠”,其中的routeblade模板引擎、console、容器以及composer扩展包为业务的开发提供了极大的便利。html

国内目前已经有众多的laravel社区,好比前端

固然还有更多可供开发者学习和交流的网站,能够自行google或者百度。mysql

不过若是看文档的话,建议查看英文网站官网(若是英语容许的话),官网也有一个对应的社区,供开发者问答,不过貌似没有那么活跃,提问题的话也须要有必定的英文基础,至少能够看懂stackoverflow上的问答。laravel

言归正传,这里会介绍一下laravel5.5的简易上手教程,若是你须要理解laravel框架总体的设计和实现原理的话,MVC、设计模式(尤为是工厂模式)、路由、管道、容器、控制反转、依赖注入等都是必需要理解的,这里并不深刻探讨,不然本做者宝宝就要吐血写个系列了,想一想都觉着累(常常加班啊没时间啦!)。git

本教程可让你在短期内按照123步骤完成一个网站的应用,贯穿laravel各个层级,对于一个刚接触该框架的开发者来讲,先应用,后深刻,这也是登堂入室的学习方式,何乐而不为呢?github

Ok, Here we go!!!

前期准备

  1. 安装php7(最好加入环境变量)。能够上官网或者软件包管理工具安装,例如: brew install php7
  2. 安装composer
  3. 安装mysql

建立laravel项目

1. 终端运行命令
composer create-project laravel/laravel blog
2. 进入blog文件夹,运行
php -S localhost:80 -t public
3. 浏览器访问 http://localhost
4. 运行命令 php artisan
若是三、4步骤运行成功,则一切无碍,能够进行下一步。
5. 利用你的编辑工具,以sublime为例,打开blog项目,Ctrl+P 找到web.php,写入以下代码,进行路由注册:
Route::get('/test', function () {
    return "<h1>Hi Sunday.</h1>";
});
这里简单解释一下,路由在 routes目录之下,有三个文件: web.phpconsole.phpchannel.php
其中, web.php是负责网站路由,也就是当 php是以 http请求的方式运行时才会用到,
console.php是在命令行运行模式下运行 artisan命令的,这个后续会讲到,
channel.php是广播消息时会用到,这个本篇略过,须要看的能够查看 文档
gethttp请求方式,路由注册时也能够用 post/put/delete/patch等, laravel-router还提供了便利的 restful风格的路由注册 resource方法,能够对后续业务处理增删改查等。
上述例子为一个匿名函数,其实通常状况下会有路由分组,前缀,中间件(后面会讲到),别名,匹配等的链式调用: Route::prefix('prefix_example')->middleware(['m_exaple_1','m_example_2'])->group(Route_Closure);
下面给一个完整的示例:
Route::prefix('hi')->middleware(['hi_m'])->namespace('sd')->group(function () {
    Route::post('sunday', 'SundayController@sunday')->name('hi.sunday.post');
    Route::put('sunday', 'SundayController@sunday')->name('hi.sunday.put');
})
怎么样? laravel路由的注册风格是否是很是友好,很是灵活多变?其中 Route也可使用 app('router')访问, app()是一个辅助方法,这个辅助方法在 vendor\laravel\framework\src\Illuminate\Foundation\helpers.php中,其中也有不少其余好用的辅助方法。 app()涉及到容器的思想和 facade门面注册,这里不详述。
6. 访问如下刚刚注册的路由,http://localhost/test
7. 手动在app/Http/Controllers下新建或命令行生成一个控制器:php artisan make:controller sd/SundayController,这时你会看到app/Http/sd下面有一个SundayController.php,将下面的代码写入:
public function sunday()
    {
        return "Hi sunday";
    }
8. web.php注册路由,并成功访问:
Route::prefix('hi')->namespace('sd')->group(function () {
    Route::get('sunday', 'SundayController@sunday')->name('hi.sunday.get');
})
9. 中间件,运行命令php artisan make:middleware MyMiddleware,会生成一个标准中间件,打开MyMiddleware.php能够看到里面有两个方法handleterminate
public function handle($request, $next)
{
    // 上面两个入参,你不用管,这个是laravel路由分发时自动注入的参数,$request是laravel封装的请求对象,Illuminate\Http\Request,你能够获取到全部超级变量的数据,也能够得到对应的一些请求处理方法如session(),getClientIp().
    // 这个方法是在进入Controller以前运行的,目的是对本次请求进行预处理或者校验等。
    app('log')->info('记录一个日志');
}

public function terminate($request, $response)
{
    // 这个方法是在请求即将关闭时运行的,能够处理一些响应相关的逻辑。
    app('log')->info('再记录一下日志');
}
10. 中间件注册,打开app/Http/Kernel.php ,在$middleware中加入
app\Http\Middleware\MyMiddleware::class
11. 查看 storage/logs/laravel.log(若是你config/app.php配置了日志channeldaily,那么应该看到的是日期格式的文件),里面应该有上一步中记录的日志信息,以及对应的日志级别,laravel的日志使用monolog,可使用多种驱动去记录日志,也能够配置上报策略,实现了loggerinterface接口,符合psr3的规范。
12. 视图层,在刚刚的方法 SundayController@sunday 中,将返回值改成:
return view('test.test', ['name' => 'sunday', 'testArray' => [1,2,3]]);

在前端模板所在目录 resources/views下建一个目录test,建一个blade模板test.blade.php,代码如:web

@if ($name )
<h1>{{$name}},你好</h1>
@else
<h1>无名氏,你好</h1>
@endif

@foreach ($testArray as $testNumber)
    <li>{{$testNumber}}</li>
@endforeach
在控制器返回视图时,第一个参数是以 .号表示 resources/views下的目录层级的,上面的 test.test则表示视图文件是在 test/test.blade.php,第二个参数是一个传递给视图层的数组,里面应当是 key => value关联数组,由于在 blade模板引擎中,会直接将对应的 key转化成一个可以使用的变量,在返回给视图以前,若是你定义了视图绑定,如在 ComposerServiceProvider中的 boot方法中注册了对应的视图绑定的话,那么会先处理这一步,而后再将数据传给目的文件。
在这个例子中, test.blade.php获得了参数以后,会经过 blade引擎分析模板文件,解析语法,转化成正常的 html文本。
{{$name}}{!!$name!!}语法至关于 <?=$name>,前者为防止xss会过滤掉一些 specialchar,后者则会直接输出文本,不安全。
@if ... @endif则是条件判断语句,行后面能够跟一个简短的 php逻辑判断
@foreach ... @endforeach 轮询数组
其余语法请参考 官方文档

以上的步骤,仅仅是完成了从路由到视图的简单处理,下面看一下数据模型,Modelsql

13. 配置数据库

database.phpshell

// config/database.php
    'mysql' => [
        'driver' => 'mysql',
        'host' => env('DB_HOST', '127.0.0.1'), // 主机
        'port' => env('DB_PORT', '3306'), // 端口
        'database' => env('DB_DATABASE', 'forge'), // 这里须要配置你的数据库
        'username' => env('DB_USERNAME', 'forge'), // 配置你的用户名
        'password' => env('DB_PASSWORD', ''), // 密码
        'unix_socket' => env('DB_SOCKET', ''),
        'charset' => 'utf8mb4',
        'collation' => 'utf8mb4_unicode_ci',
        'prefix' => '',
        'strict' => true,
        'engine' => null,
    ],

.env

// .env文件
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=test #这里须要你手动在数据库建立一下数据库
DB_USERNAME=root #你本身的用户名
DB_PASSWORD=pwd #你本身的密码
14. 运行artisan命令 php artisan make:auth
15. 运行artisan命令 php artisan make:migration 建立user表和密码表,进入你的数据库中查看是否建立成功
16. 这时,打开网站首页,你会看到有一个登陆标志,当你注册成功以后,你会看到user表中多了一条数据,表示数据库链接是成功的。
model能够经过 php artisan make:model TestModel来建立,若是你没有特殊要求的话,它会出如今 app目录下。
进入该 Model你会看到它继承了一个 Eloquent\Model,这个 ORM model能够为你提供多种多样的 CURD方法,具体可见 文档,在Model里面须要自定义一些属性,例如 table、fillable、guards等,支持软删除 use SoftDeletes,但对应表中必需要有 deleted_at字段。
你也能够用DB匿名类或者app('db')来获得一个比EloquentModel更加原始的模型对象,这会让你对数据库的操做更加原生,详见 文档

以上就是对应的MVC使用的简单介绍

下面,让咱们看看console的使用
  1. 终端进入项目目录,运行php artisan能够查看全部可执行命令
  2. 运行 php artisan route:list能够查看已成功注册的路由列表
  3. php artisan make:command NewCommand建立一个新的命令
  4. 打开app/Console/Commands/NewCommand.php,在$signature后定义一个命令的名称如:test:test {--O|op= : 这是个人测试参数},在handle()方法中写入你的逻辑。如:
$this->info('我第一个命令'); // 会在终端上输出该文本
$this->error('个人命令错了'); // 会在终端上输出该文本
$this->confirm('确认个人命令?'); // 选择yes/no
$this->choice('我还有其余选择:', ["A", "B"]); // 选择一个
$this->output->progress(); //进度条
echo $this->option('op'); // 获取所定义参数值

以后,在app/Console/Kernel.php $commands注册命令App\Console\Commands\TestCommand::class,运行php artisan test:test --op=1,成功输出1,这条命令算是完工了。

若是你想要加入定时任务,能够将命令加在 schedule()中, $schedule->cron("0 0 0 0 0")这里填写 crontab的格式。
你能够运行 php artisan schedule:run来执行定时任务
laravel会在你项目维护或迭代时自动完成定时任务的重启

composer扩展包

若是你有心,当你建立一个laravel项目的时候,就会注意到,composer会在项目中建立一个vendor目录,这个目录下保存着各式各样的扩展包,如:laravel/framework、symphony/console、monolog/monolog等,这些扩展包是laravel的宝库,为你的开发提供了极大便利。

全部的扩展包都须要符合psr4加载规范,经过spl_autoload_register()方法自动加在,composer会生成一个autoload_classmap.php你能够找到全部加载到的类和文件。

如何开发一个composer扩展包呢?

1.新建目录test,进入运行 composer init

这里 type通常选择 project/librarylicense通常选择 MIT协议(一种开源受权协议)

2.打开composer.json,加入psr4规则:

"autoload": {
    "psr-4": {
        "Name1\\\Name2\\": "name/src/Name" // 这里表示按照psr4规范,对于name/src/Name目录下的全部文件,加载命名空间以Name1\\\Name2\\为前缀的类。
    }
}

3.建立name/src/Name目录,在Name目录下建立文件NameServiceProvider.php,代码以下:

<?php
namespace Name1\Name2;

use Illuminate\Support\ServiceProvider;

class NameServiceProvider extends ServiceProvider
{
    public function boot()
    {
        require __DIR__ . '/helpers.php';
        log_info('我进来了');
    }
}

因为log_info()这个方法咱们没有定义过,因此能够在helpers.php中进行定义:

<?php

if (!function_exist('log_info')) {
    function log_info($message) {
        echo $message . PHP_EOL;
    }
}

咱们也能够建立一个更深层次的目录,如Handlers,在其下建立一个TestYou.php:

namespace Name1\Name2\Handlers;

class TestYou
{
    public function test()
    {
        log_info("test");
    }
}

建立一个匿名类Facades/Test.php:

namespace Name1\Name2\Facades;

use Illuminate\Support\Facades\Facade;

class Test extends Facade 
{
    protected static function getFacadeAccessor()
    {
        return "test";
    }
}

材料已准备完毕,下面开始切菜:

// NameServiceProvider

public function register () 
{
    $this->app->bind('test', Name1\Name2\Handlers\TestYou::class);
}
为何必定要定义匿名类呢?由于 laravel框架自己要求就是少去关注工具类的实现,多关注业务自己,因此全部的sdk或者扩展包都在接入时尽可能提供便利,其中 $this->app->bind()也体现了一个依赖注入控制反转的思想,使得定义了匿名类的,能够在 config/app.php中注册相应匿名类 TestNameServiceProvider以后能够以极为便利的方式使用,如: \Test::test(),或者 app('test')->test(),不须要管他们的命名空间。

上述的扩展包功能已经基本成形,你须要将它放到相应的代码托管仓库中,如githubhttps://packagist.org(推荐),你能够尝试在laravel中使用命令composer require {你的package名字}进行安装。

后语

本文因为初次编写,必然有诸多不合理之处,但愿读者们多多给出优化意见,之后在文章中会考虑到,你们共同成长,一块儿发财。

stay hungry, stay foolish.

相关文章
相关标签/搜索