[入门级] Laravel 开胃菜 | Laravel Appetizer
适合入门新人,高手请看有没有笑话,原文地址 Laravel Appetizer
==========================
教程手册#
- laravel-5-fundamentals
- 国内 Enda 袁超 Laravel 视频教程
- 最适合中国人的 Laravel 教程
- Laravel 博客开发教程
- Laravel 手册
- Laravel 官方文档
就推荐这几个,其实最重要的还是官方文档,个人建议看英文,当然也有中文翻译 Laravel 中文文档,这个自行选择。当然,如果你只是看文档,想深入很难,多看框架的实现代码才是王道!
环境配置相关#
Laravel 本身提供 Homestead 集成环境,很方便。
安装教程:Windows Homestead Install / Mac Homestead Install。当然如果你觉得都很麻烦,用 XAMPP/MNPP 这类的也是可以的。
开发工具:PHPStorm 必选无疑(新版的要激活了,好人做到底 -->ACTIVATION)
请支持正版 !!!请支持正版 !!!请支持正版 !!!
当然还有一些辅助调试的工具包,如:barryvdh/laravel-debugbar, 可自行选择。
最后还有个头疼的 Composer 为什么头疼?GFW 啊。。。。国内太慢,Laravel install 一下能半天。。。上梯子 Packagist / Composer 中国全量镜像 怎么设置里面有说明。
框架基础#
如果你之前没都没有接触过框架,不懂框架是个什么样的概念,最好自行补课,至少得明白 MVC 框架(Laravel 是 MVC 框架)是个什么意思。
Laravel 的几个必知概念点:
- 模型(Model->Eloquent)
- 视图(View->Blade Template)
- 控制器(Controller->[Route,MiddlerWare,Request,Controller,Response])
这里我把 Router、MiddleWare 等也划入了 Controller 这个层面,我觉得这样比较好理解。
模型#
模型基本上就是用来和数据库打交道的。但也有人喜欢在 Model 里封装一些相关的方法,个人不建议这么的,当然这里的小技巧一会再说。
<?php
/**
* Class Pad
* @property string brand
* @property integer RAM
* @property integer size
* @property float price
* @property \Carbon\Carbon $created_at
* @property \Carbon\Carbon $updated_at
*/
class Pad extends Eloquent
{
protected $table = 'pads';
}
这里建议把你模型的一些属性或者方法(基本就是你的数据库字段)以注释的形式写到模型类里,这样方便 IDE 识别或者提示。在模型类的命名空间方面需要注意的是,框架并不限制你把模型放到哪里(默认在 app
目录下,5.1 的命名空间为 App), 这里建议是在 app 同级目录新建一个 models 目录,将这个目录用 Conposer 自动加载到根命名空间下。这里需要解释的是,我之所以去掉 App 命名空间是应为我的项目是 L4.2 开始的,在处理 Polymorphic Relations 的时候,xxxable_type 里是存的根命名空间的模型类(如:User),所以这里为了省事,直接放到了根命名空间(当然还有其他方法)。
"autoload": {
"classmap": [
"database"
],
"psr-4": {
"App\\": "app/",
"":"models/"
}
}
视图#
视图这个其实没什么好说的,在 Laravel 自带的 Blade 模板引擎用起来还是蛮顺手的,新版的 PHPStorm 直接支持的比较方便
控制器#
控制器这里我把 Route,MiddlerWare,Request,Controller,Response 都划分了在一起,原因是应为他们结合在一起完成了请求的处理调度响应的控制流程,可能不太科学,但个人觉得这样比较适合新人理解。
Route 在 Laravel 中起到了调度请求的一个作用,就像一条条马路一样,这条道到哪里,那条到哪里。当然,路由的调度,不一定要转接给控制器,路由也可以直接返回响应 (闭包)。这里有个注意点,就是在使用 Laravel 的 resource controller 的时候,如果你需要增加自定义的路由入口到该 controller,请务必写在 resource 导向之前。
Route::get('photos/popular', 'PhotoController@method');
Route::resource('photos', 'PhotoController');
MiddlerWare 在 Laravel 中扮演的是一个 “交警” 的角色,它可以用来进行请求的一些处理前过滤,或者做请求处理后的善后工作,用法大家自行看文档吧。
Request 在 Laravel 中相当于大路上行驶的车吧。他对用户的请求做了一下封装,我们可以通过 facade 或者依赖注入来获取 Request 实例,从而取得请求的参数等信息。
Controller 是 Laravel 处理用户请求的处理中心,我们可以适当的把一些简单业务逻辑写在 controller 中,然后做出相应处理。但是我为什么说只是做一些简单的业务逻辑呢? 当你业务逻辑太过于复杂的时候,你的代码就会相应的变多,那一个控制器的话会整个变得很长,不方便阅读;其次,这些复杂的业务逻辑如果都写在控制器的方法中,那么你很难做到复用。那这里就要用到 Laravel 的 Repositories (5.1 中是有默认文件夹的,5.2 中好像是移除了默认文件夹,如果没有可自行在 app 目录下创建,注意遵循 PSR4),把你的业务逻辑写到 Repositories 中,然后在 Controller 中 new 或者依赖注入。
<?php
/**
* Created by PhpStorm.
* User: xutao
* Date: 15/8/3
* Time: 09:17
*/
namespace App\Repositories;
use Carbon\Carbon;
use Product;
use WxPayUnifiedOrder;
use WxPayOrderQuery;
use WxPayApi;
use NativePay;
class WeChatPayRepository
{
private $user;
public function __construct()
{
$this->user = \Auth::user();
}
/**
* Create Inner Order
* @param Product|Eloquent/Model $product
* @param $amount
* @return array
*/
public function createOrder($product, $amount)
{
//a lot of things for creating a order
}
}
namespace App\Http\Controllers;
use App\Repositories\WeChatPayRepository;
class DepositController extends Controller
{
/**
* Create order and display the qrcode
* @param WeChatPayRepository $repository
* @param Request $request
* @return \Illuminate\Http\Response
*/
public function store(WeChatPayRepository $repository, Request $request)
{
$product = \Product::findOrFail(1);
$amount = $request->get('points', 0);
$trade = $repository->createOrder($product, $amount);
if (!$trade) {
//生成订单出错
}
$url = route('qrcode', ['url' => $trade->url]);
return \Redirect::route('more.deposit.show', [$trade->id, 'url' => $url]);
}
}
Response 是最后一个点了。Response 呢是 Laravel 对返回的一些封装,可以通过 Response 对象设置返回的 header 头,设置返回的数据等等。但是在 web 项目中,我们大多数返回的是视图(View),其实 View 渲染,然后封装成 Response 对象。
框架进阶#
IoC 容器和 Facades#
IoC 容器和 Facades 是我们在 Laravel 框架中常用到的一些东西,可能新手不是太了解这个东西,如果要详细讲解起来会长,比较占篇幅,这里我给个写的不错的博文,大家可自行查看。laravel 学习笔记 —— 神奇的服务容器。
- Container 相当于一个箱子
- Laravel 在 boot 的时候通过 ServiceProvider 向箱子里面加东西,注明什么东西放在箱子的哪个地方
- 当你需要什么东西的时候,通过 Facade(放入时的注明)去取得这个东西(LazyLoad | 如果放入的时候已经实例化了那取得的就是实例)。
Artisan 命令行#
Laravel 提供的 Artisan 方便了 PHP 的命令行方式的交互。目前在我们项目当中 Artisan 用得最多的是定时的计划任务、数据的批量处理等。注意:命令行模式做数据处理,请做好最全面的异常处理或者进度保存。
定时计划任务:需要结合 Linux 的 Crontab 来做定时。
sudo crontab -e
# automatic statistic 每小时的第10分钟运行一次artisan的statistic命令
10 * * * * /usr/bin/php /var/www/admin/artisan statistic
Queue#
Laravel 的队列支持 database, Beanstalkd, Amazon SQS, Redis 和 synchronous。最后一个是本地的文件方式,默认选项,可以当做开发使用,如果是在线上部署的话,我还是推荐 Beanstalkd。理由是在国内的话 Amazon、SQS 等就不用考虑了,Database 肯定不太适合(查询效率),那就剩下 Beanstalkd 和 Redis,二者的话性能方面应该是差不多的,但是 Redis 没有一个可视化的管理界面,我们不能清楚的了解队列的状态,而这点 Beanstalkd 却提供有可视化界面 Tools。这里推荐:benstalkd_console, 都有现成的 Docker Image Pull/Run 就搞定了。
总结#
总的来说 Laravel 我也用了一年多了,感觉还是顺手的(可能我接触的框架比较少,至少开始用 4.2 的时候 Laravel 甩当时的 Think3.X 几条街吧,我木有鄙视国产的意思 --|),IoC 容器、DI、facade 等用起来也是相当爽的,扩展性也是杠杠的,需要是什么扩展包去 packagist 或者 git 上找一找,require 一下就 OK 了,所以在开发上会省很多造轮子的时间。
值得一提的是最近出了 Lumen5.2(Laravel 的精简版,最新版本基本上以 API 为目标了),那用 Laravel 做 API 也是 66 的了,大家可以去尝试下。(之前我是用的 L4.2+dingo API 做的)
Any way ,先说这么多等以后有想到什么再来补充吧。
推荐文章: