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生命週期

相關文章
相關標籤/搜索