Kingyeung Chan

THINK GREAT THOUGHTS AND YOU WILL BE GREAT

大家好,我系Monster.Chan,一名来自中国的 iOS / AWS / Unity3D 开发者,就职于SAINSTORE。在不断修炼,努力提升自己


结合工作经验,目前写了《Getting Started with AWS》、《Websites & Web Apps on AWS》,欢迎试读或者购买

Laravel入门记录

今天有时间打算学习一下Laravel。下面是一些简单的学习记录,希望对各位也有帮助。

基础设置

1.安装composer

之前就想抽时间学习Laravel,不过觉得安装有点复杂,我想很多人都有过这种想法。这里给大家推荐一个composer的中国镜像,速度真的不错。

安装Composer前确认你已经正确安装了PHP,打开控制台(Mac)执行php -v查看是否输出正确的版本号。

打开控制台并执行以下命令安装最新版的Composer:

//下载安装脚本composer-setup.php到当前目录  
php -r "readfile('https://getcomposer.org/installer');" > composer-setup.php  
//执行安装过程  
php composer-setup.php  
//删除安装脚本  
php -r "unlink('composer-setup.php');"

Composer的安装分局部安装和全局安装,这里只介绍局部安装。执行完上述命令后将会得到composer.phar文件,将其复制到任意目录(比如项目的根目录下),然后执行php composer.phar即可使用Composer了。

不要忘记要经常执行php composer.phar selfupdate保持 Composer 一直是最新版本

2.Composer用法

实际上有两种方式启用本镜像服务:
* 系统全局配置:将配饰信息添加到Composer的全局配置文件config.json
* 单个项目配置:将配置信息添加到某个项目的composer.josn文件中。

下面为大家介绍修改当前项目composer.json配置文件(请原谅我比较懒,全局配置其实也不复杂):
打开控制台(Mac)并执行以下命令(确认你的composer.phar已经复制到位):

php composer.phar config -g repo.packagist composer https://packagist.phpcomposer.com
3.安装Laravel

镜像配置完,在终端离切换到你想放置改网站的目录下,运行以下命令:

composer create-project laravel/laravel learnlaravel5

稍等片刻,目录下会出现一个叫learnlaravel5的文件夹,这样就完成安装了。

4.运行

这里我才用PHP内置的web服务器来驱动站点,运行以下命令:

cd learnlaravel5/public
php -S 0.0.0.0:2024

这时候访问http://127.0.0.1:2024就是这个样子的:

当然也可以使用Apache或者Nginx来驱动Laravel,这次就不在这里介绍了,有兴趣的朋友可以自己研究。

Auth系统

Laravel内置了非常完善的简单用户登录注册功能,适合一些需求不复杂的用户权限管理系统。这里其实涉及到trait这个PHP5.4+的新特性。

执行以下命令,激活这个功能:

php artisan make:auth

访问http://127.0.0.1:2014/login,会看见如下页面:

连接数据库

接下来需要连接数据库,请自行准备好MySQL服务。

learnlaravel5目录下已经有一个.env文件,如果没有,可以复制一份.env.example文件重命名为.env,然后修改下面几行:

DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel5
DB_USERNAME=root
DB_PASSWORD=password

建议新建一个名为laravel5数据库,并且使用root账户直接操作,简单快捷。

配置完数据库后,在登录界面填写任意邮箱和密码,点击Login,这时候会报错,单不用担心,因为我们确实没有创建users表,下面让我们见识一下Laravel的另一个特性。

数据迁移

执行以下命令:

php artisan migrate

会出现以下提示信息:

说明数据迁移成功,现在在此访问http://127.0.0.1:2024/home注册一个用户并完成登录。
其实migrate就是PHP描述数据库构造,并且使用命令行一次性部署所有数据库结构。你可以在learnlaravel5/database/migrations目录下找到上面截图的文件,一打开就知道它在干什么了。

ORM->Eloquent

Eloquent是Laravel中最强大的地方,但也是它最慢的地方,目前还是没能彻底解决。
下面我们使用Artisan工具新建Model类以及其附属的Migration和Seeder类。
运行以下命令:

php artisan make:model Article

执行成功后在app目录会生成一个Article.php的文件,这就是Artisan自动生成的Model文件:

<?php  
namespace App;  
use Illuminate\Database\Eloquent\Model;  
class Article extends Model  
{
}  

使用Migration和Seeder

下面是用Artisan生成这个Model对应的Migration和Seeder:

php artisan make:migration create_article_table

成功会在learnlaravel5/database/migrations生成名为*_create_artisan_table的文件,接下来我们修改up函数:

   public function up()
    {
        //
        Schema::create('articles', function(Blueprint $table)
        {
            $table->increments('id');
            $table->string('title');
            $table->text('body')->nullable();
            $table->integer('user_id');
            $table->timestamps();
        });
    }

这几行代码是Article对应的数据库表要创建的表的结构,下面我们来执行命令,让它变为MySQL中真实的数据表:

php artisan migrate

下面是用Artisan生成Seeder,Seeder主要解决在开发Web应用是手动向数据库插入数据这样的繁琐工作,同字面意思播种机还是挺配的。

php artisan make:seeder ArticleSeeder

然后在learnlaravel5/database/seeds里面多了一个ArticleSeeder.php文件,现在我们修改run函数:

   public function run()
    {
        //

        DB::table('articles')->delete();

        for ($i=0; $i < 10; $i++) {
            \App\Article::create([
                'title'   => 'Title '.$i,
                'body'    => 'Body '.$i,
                'user_id' => 1,
            ]);
        }
    }

接下来需要把ArticleSeeder注册到系统内,修改learnlaravel5/database/seeds/DatabaseSeeder.php中的run函数:

    public function run()
    {
        // $this->call(UsersTableSeeder::class);

        $this->call(ArticleSeeder::class);
    }

由于database目录没有像app目录那样被composer注册为psr-4自动加载,采用的是psr-0 classmap 方式,所以我们还需要运行以下命令把ArticleSeeder.php加入自动加载系统,避免找不到类的错误:

composer dump-autoload

然后执行seed

php artisan db:seed

Laravel的MVC架构

路由是很多有PHP框架的核心,路由承载的是URL代码片段的映射。Laravel路由中文文档

Laravel 5 的路由在app/Http/routes.php这个位置,打开这个文件:

Route::get('/', function () {
    return view('welcome');
});

Route::auth();

Route::get('/home', 'HomeController@index');

中间的Route:auth()就是Auth系统注入的路有配置。

基础陆游解释

上述代码中的前三行是闭包路由:

Route::get('/', function () {
    return view('welcome');
});

闭包路由是用闭包作为此条请求的响应代码,灵活方便,很多简单的操作可以直接在闭包里面解决。现在我们来实现输入当前服务器时间:

Route::get('now', function(){
    return date("Y-m-d H:i:s");
});

框架默认设置是UTF时间,这里修改为北京时间,在earnlaravel5/config/app.php第55行处把timezone设置为上海:

'timezone' => 'Asia/Shanghai',

然后访问http://127.0.0.1:2024/now可以得出如下结果:

闭包路由虽然灵活性高,不过大多数场景下我们还是需要回归到MVC架构下:

Route::get('/home', 'HomeController@index');

这样代码的意思不能懂,就是当GET方法访问http://127.0.0.1:2024/home的时候就调用HomeController控制器中的inde方法。同理你可以修改为Route::post('/home', 'HomeController@index');,用POST来响应请求。

细心的你也许已经发现,这里才用的是控制器@方法的形式。Laravel 的路由跟所有 PHP 框架的路由一样,都是用的最简单直接的 PHP 方式来调用控制器中的方法的:使用字符串初始化类得到对象,调用对象的指定方法,返回结果。下面简单介绍一下 Laravel 路由调用过程。

定为到learnlaravel5/app/Providers/RouteServiceProvider.php文件最后的mapWebRoutes方法,给所有路由统一加进了一个路由组,定义了一个命名空间和一个中间件:

   protected function mapWebRoutes(Router $router)
    {
        $router->group([
            'namespace' => $this->namespace, 'middleware' => 'web',
        ], function ($router) {
            require app_path('Http/routes.php');
        });
    }

往上看,你会发现命令空间的定义地方:

protected $namespace = 'App\Http\Controllers';

那么命名空间、类、方法是如何传递的?

现在让我们定为到learnlaravel5/vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.phpdispatch方法,在return前增加一行var_dump($controller);:

    public function dispatch(Route $route, Request $request, $controller, $method)
    {
        $instance = $this->makeController($controller);
        var_dump($controller);
        return $this->callWithinStack($instance, $route, $request, $method);
    }

这样可以清晰看见加载情况了。

记住最后注释掉添加的var_dump($controller);

Laravel使用了完整的面向对象程序架构,对控制器的调用进行了超多层封装,所以最简单的探测方式就是手动抛出错误,这样就会完整地显示调用栈的情况。

现在让我们回到HomeController的index方法里,在return之前增加一行throw new \Exception('到此一游', 1);,然后执行一下登录操作:

留意上图第三行,这里就是驱动了HomeController。

最近的文章

Xcode8.0+安装Alcatraz插件

Xcode8以上Alcatraz无法正常安装,只能够通过一些略嫌麻烦的渠道去实现。 安装Alcatraz先清理之前安装的版本rm -rf ~/Library/Application\ Support/Developer/Shared/Xcode/Plug-ins/Alcatraz.xcpluginrm -rf ~/Library/Application\ Support/Alcatraz/安装最新版curl -fsSL https://raw.github.com/supermarin/...…

继续阅读
更早的文章

iOS Mantle使用小记

Mantle简介Mantle是github的工程师们弄出来的东西,是iOS和Mac平台下基于Objective-C编写的一个简单高效的模型层框架。 Mantle能做什么当我们从服务器获取数据,这些数据一般都为JSON格式,我们常用的做法是将JSON数据转为Model对象,然后我们就从Model对象的属性里读取数据。 也许你已经体会到这时噩梦的开始,因为你每次都要用-initWithDictionarty:(NSDictionary *)dict等类似方法来初始化,把JSON数据里的值一...…

继续阅读