Laravel核心概念学习

1、Laravel请求过程

clipboard.png

2、artisan命令

下面会以生成用户表为例(注意表名通常为复数): php

一、生成迁移文件html

Pro-3:mac$ php artisan make:migration create_users_table
Migration: 2016_11_23_131412_create_users_table

2.而后在database/migrations生成的迁移文件中,添加相关的字段:前端

2016_11_23_131412_create_users_table.php
<?php

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateUsersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('users', function (Blueprint $table) {
           $table->integer('id')->unique()->unsigned(); // 学号惟一,取正数
            $table->string('name');
            $table->string('password');
            $table->string('phone')->default('');
            $table->string('sex')->default('');
            $table->string('email')->default('');
            $table->string('pro_class')->default('');
            $table->boolean('is_admin')->default(0);
            $table->rememberToken();
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::drop('users');
    }
}

最后,执行 php artisan migrate命令,在数据库中生成表usersnode

MacdeMacBook-Pro-3:laravel mac$ php artisan migrate

以上能够在数据库中生成一张带有字段的Users表,这比咱们直接在数据库中新建表并写相关的字段优雅的多。laravel

3.接下来咱们给这张表填充一些测试的数据:用命令生成填充表UserTableSeederweb

Mac:laravel$ php artisan make:seeder UsersInfoTableSeeder
Seeder created successfully.

以下所示,咱们将修改 Laravel 预先生成好的 UserTableSeeder 类来给 run 方法添加一段可在数据库添加数据的语法:redis

<?php

use Illuminate\Database\Seeder;
use App\Users;
use App\Grade;

class UsersTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        DB::table('users')->delete();

        Users::create([
            'id' => 2010300001,
            'name' => '周润发',
            'password' => Hash::make('2010300001'),
        ]);
        Users::create([
            'id' => 2010300002,
            'name' => '周星驰',
            'password' => Hash::make('2010300002'),
        ]);
        Users::create([
            'id' => 2010300003,
            'name' => '成龙',
            'password' => Hash::make('2010300003'),
        ]);
        Users::create([
            'id' => 2010300004,
            'name' => '张曼玉',
            'password' => Hash::make('2010300004'),
        ]);
    }
}

在 DatabaseSeeder 类中,你可使用 call 方法来运行其它的 seed 类。为避免发生单个 seeder 类变得太大的状况,可以使用 call方法来将数据填充拆分红多个文件。只需简单传递你想要运行的 seeder 类名称便可:数据库

<?php

use Illuminate\Database\Seeder;
use Illuminate\Database\Eloquent\Model;

class DatabaseSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        Model::unguard();

        // 执行插入用户详细数据
         $this->call(UsersTableSeeder::class);

        Model::reguard();
    }
}

运行数据填充:npm

MacdeMacBook-Pro-3:laravel mac$ composer dump-autoload
Generating autoload files
MacdeMacBook-Pro-3:laravel mac$ php artisan db:seed
Seeded: UsersTableSeeder

查看users表,数据填充OK:设计模式

clipboard.png

PHP artisan 命令整合:

①、建立迁移文件,填写字段,建立表

php artisan make:migration create_users_table

// 生成表
php artisan migrate

// 填充数据
php artisan make:seeder UsersTableSeeder

// 运行数据填充
composer dump-autoload
php artisan db:seed

②、建立控制器:

php artisan make:controller Admin/AdminController

③、建立中间件

php artisan make:middleware isAdmin

③、建立模型类等命令

// 建立一个新的 Eloquent 模型类
php artisan make:model name

// 建立一个新的资源控制器
 // --plain      生成一个空白的控制器类
php artisan make:controller [--plain] name
php artisan make:controller App\\Admin\\Http\\Controllers\\DashboardController
// 建立一个新的事件类
php artisan make:event name
// 建立一个新的中间件类
php artisan make:middleware name
// 建立一个新的迁移文件
 // --create     将被建立的数据表.
 // --table      将被迁移的数据表.
php artisan make:migration [--create[="..."]] [--table[="..."]] name

// 建立一个新的服务提供者类
php artisan make:provider name
// 建立一个新的表单请求类
php artisan make:request name

3、使用Bower+Gulp集成前端资源

咱们将讨论如何将前端资源集成到项目中,包括前端资源的发布和引入。本项目将使用 Bower 和 Gulp 下载和集成 jQuery、Bootstrap、Font Awesome 以及 DataTables。

如今的 web 站点包含不少东西:框架、库、前端资源,等等。若是每一个组件都必须从头至尾本身写,不论是从时间、效率、质量上来讲,都是不明智的。

因此,不要重复造轮子。

下面咱们将会使用 Bower 来获取和安装前端资源包。

安装node.js,须要使用npm包管理工具安装Bower
具体请参考该文章 前端资源整合

4、服务容器Container之依赖注入

服务容器就是一个普通的容器,用来装类的实例,而后在须要的时候再取出来。用更专业的术语来讲是服务容器实现了控制反转(Inversion of Control,缩写为IoC),意思是正常状况下类A须要一个类B的时候,咱们须要本身去new类B,意味着咱们必须知道类B的更多细节,好比构造函数,随着项目的复杂性增大,这种依赖是毁灭性的。控制反转的意思就是,将类A主动获取类B的过程颠倒过来变成被动,类A只须要声明它须要什么,而后由容器提供。

这样作的好处是,类A不依赖于类B的实现,这样在必定程度上解决了耦合问题。

在Laravel的服务容器中,为了实现控制反转,能够有如下两种:

  • 依赖注入(Dependency Injection)。

  • 绑定。

class UserController extends Controller
{
    /**
     * The user repository implementation.
     *
     * @var UserRepository
     */
    protected $users;

    /**
     * Create a new controller instance.
     *
     * @param  UserRepository  $users
     * @return void
     */
    public function __construct(UserRepository $users)
    {
        $this->users = $users;
    }

    /**
     * Show the profile for the given user.
     *
     * @param  int  $id
     * @return Response
     */
    public function show($id)
    {
        $user = $this->users->find($id);

        return view('user.profile', ['user' => $user]);
    }
}

小结:
依赖注入,就是只声明须要实例化的类型,而真正的实例化是在这个Container容器中进行,容器就是用来装须要实例化的对象,旧的作法是须要引入某个类,而后再实例化处理,而注入只需传递对象类型名字便可,剩下的会在容器中实例化。

5、Contracts & Facades(合同&假象)

Laravel 还有一个强大之处是,好比你只需在配置文件中指明你须要的缓存驱动(redis,memcached,file......),Laravel 就自动办你切换到这种驱动,而不须要你针对某种驱动更改逻辑和代码。Why? 很简单,Laravel定义了一系列Contracts(翻译:合同),本质上是一系列PHP接口,一系列的标准,用来解耦具体需求对实现的依赖关系。其实真正强大的公司是制定标准的公司,程序也是如此,好的标准(接口)尤其重要。当程序变得越来大,这种经过合同或者接口来解耦所带来的可扩展性和可维护性是无可比拟的。

Contracts:提供一系列的标准,在两方都须要遵照该协议,如以前是A直接到B,A-B ,增长协议后,A-C-B处理,B只需遵循C便可,无论A是如何变,这样能够实现解耦关系,不须要更改B的具体逻辑代码,这种思路很是好。

Facades:
在咱们学习了容器的概念后,Facades就变得十分简单了。在咱们把类的实例绑定到容器的时候至关于给类起了个别名,而后覆盖Facade的静态方法getFacadeAccessor并返回你的别名,而后你就可使用你本身的Facade的静态方法来调用你绑定类的动态方法了。其实Facade类利用了__callStatic() 这个魔术方法来延迟调用容器中的对象的方法,这里不过多讲解,你只须要知道Facade实现了将对它调用的静态方法映射到绑定类的动态方法上,这样你就可使用简单类名调用而不须要记住长长的类名。这也是Facades的中文翻译为假象的缘由。

public function register()
{
        $this->app->bind('XblogCache', function ($app) {
            if (config('cache.enable') == 'true') {
                return new Cacheable();
            } else {
                return new NoCache();
            }
        });
}

即之后能够用XblogCache的别名来调用实例化后的的new Cacheable();或new NoCache();方法了,即
XblogCache->getCache();

6、总结

Laravel强大之处不只仅在于它给你提供了一系列脚手架,好比超级好用的ORM,基于Carbon的时间处理,以及文件存储等等功能。可是Laravel的核心很是很是简单:利用容器和抽象解耦,实现高扩展性。容器和抽象是全部大型框架必须解决的问题,像Java的Spring,Android的Dagger2等等都是围绕这几个问题的。因此本质上讲,Laravel之因此强大出名,是由于它的设计,思想,可扩展性。而Laravel的好用功能只是官方基于这些核心提供的脚手架,你一样也能够很轻松的添加本身的脚手架。

因此不要以为Laravel强大是由于他提供的不少功能,而是它的设计模式和思想。

  • 理解Laravel生命周期和请求的生命周期概念。

  • 的静态变量和单例,在下一个请求到来时都会从新初始化。

  • 将耗时的类或者频繁使用的类用singleton绑定。

  • 将变化选项的抽象为Contracts,依赖接口不依赖具体实现。

  • 善于利用Laravel提供的容器。

原文连接:
Laravel的核心概念
深刻理解php底层:php生命周期