程式狂想筆記

一個攻城師奮鬥史

0%

Laravel 實作小記

由於最近看 Laravel 都沒有用在實戰上面
想藉由這個機會時做看看
不寫還真的有些不習慣
特別紀錄一下

–尚未整理完–

Laravel 新增檔案起手勢

建立一個 Model

–migration 順便產生 migrate 檔案

Table 取的名會是複數
Table 取的名會是複數
Table 取的名會是複數
獎如是要自己新增的要注意!!!

1
2
php artisan make:model Event --migration
php artisan make:model Timer --migration

建立一個 Controller

1
2
php artisan make:controller CustomersController
php artisan make:controller CustomersController --model=Customer

--migration 我以為能順便新增 migrate
但是不行!!!

三個願望一次滿足

新建東西,想把所有 Controller 建立出來要怎麼用?
Laravel 5.4 create model, controller and migration in single artisan command - Stack Overflow

1
php artisan make:model Todo -mcr

-m, –migration Create a new migration file for the model.
-c, –controller Create a new controller for the model.
-r, –resource Indicates if the generated controller should be a resource controller
或者

1
php artisan make:model Todo -a

-a, –all Generate a migration, factory, and resource controller for the model

Model 要注意的事情

fillable

每次新增 Model 完成,但通常會忘記填這個東西
仔細看這個,這個變數是防止 input 帶入 model 裡面
會被塞入奇奇怪怪的值
某種意義來說就是安全性!!

關聯

hasMany <=> belongTo

hasMany

1
2
3
4
public function comments()
{
return $this->hasMany('App\Comment');
}
1
2
3
4
public function post()
{
return $this->belongsTo('App\Post');
}

Laravel 多張 table 使用 ORM 查詢 (遠層一對多關聯) – Bryce’S Note

Many to Many

我一直以為 X 對 X 就是講兩個 table,但是多對多簡單來講就是要用3個 table
而中介 table 命名為aaa_bbb(照英文順序命名,如:bbb_aaa會有問題,但可透過 belongToMany(xxxx,’bbb_aaa’))

簡單說一下,Many to Many 實作使用 3 個 table 但是只會寫 2 個 table(但 pivot 可自訂 class),詳細官網一下,但通常應該不用寫
使用上 attach,detach,sync 控制 pivot 內容
pivot 通常不會建立 id 欄位
當然要設定也是能做到

ORM with 預載入

只能用再 X 對多

Event()->timers() 出現找不到 function 問題

BadMethodCallException with message 'Call to undefined method App/Event::timers()'
哪尼我照官方範例新增一個 Project 怎麼會錯呢!!!
怎麼 Google 都找不到問題,最後我發現是protected關係,要用public
為什麼呢? App\Event::find(1) 沒有 new 出物件
所以protectedtimers()就呼叫不到!!!
這是很正常的
所以要用public!!!
所以要用public!!!
所以要用public!!!
耗費一小時在查這個 orz

Model::find(20) 實現原理

這篇寫的很清楚
深入理解 laravel 中的 Eloquent ORM、查询构建器的核心原理 - 简书

命名建議

Form 表單這件事

我覺得網頁這個要熟悉
才能掌握網頁的程式
但是實作才了解 Laravel 我還不太了解

create 和 edit 拆開寫兩個 View

一開始實作我覺得應該有方法讓兩個 view 合併
我從書上 view 有一個 old() 函式可以呼叫 redirect->with 出來東西
但是 view 變數沒抓到(未定義)的時候,可能程式錯誤無法顯示問題

再繼續寫,我發現 from 表單我使用route定義的時候
我發現一件事情,action 導去路徑不一樣
@method('POST')@method('POST') 不一致
就算這些可以用邏輯去判斷網址
但我覺得會越來越亂
為何不如就分開兩個 view

其實表單重複的部分
我覺得可以用@include帶入
不過我等熟悉看如何做到

contoller view

1
2
3
return view('page/week1/list');
return view('page.week1.show')->with('event', Event::find($id));
return view('page.week1.update', ['event' => $event]);

可以用多個帶值到 View 裡面
可算說是非常方便

驗證起手勢

1
2
3
4
5
6
7
8
9
10
11
$input = Input::all();

$validator = Validator::make($input, [
'name' => 'required|max:100',
]);

if ($validator->fails()) {
return redirect()->route('week1.edit', ['id' => $id])
->withErrors($validator)
->withInput();
}

尚未了解事情

1
2
3
4
// 非正確的時候會導入到首頁,目前找不到修改對應首頁方法,建議用Validator::make
$validatedData = $request->validate([
'name' => 'required|max:1',
]);

error 顯示方法

redirect()->withErrors
可以抓取到

1
2
3
4
5
6
7
8
@if ($errors->any())
<div class="alert alert-danger">
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>

正如前面所提到的,Laravel 會自動把使用者重導到先前的位置。另外,所有的驗證錯誤會被自動快閃至 session。
同樣的,注意我們不需要在 GET 路由明確的綁定錯誤訊息至視圖。這是因為 Laravel 會自動檢查 session 內的錯誤資料,如果錯誤存在的話,會自動綁定這些錯誤訊息到視圖。所以,請注意到 $errors 變數在每次請求的所有視圖中都將可以使用,讓你可以方便假設 $errors 變數已被定義且可以安全地使用。\$errors 變數是 Illuminate\Support\MessageBag 的實例。有關此物件的詳細資訊,請查閱它的文件。

success 方法

內建沒有 WithSuccess
但還是可以塞自己想要的資料

1
2
return redirect()->route('week1.edit', ['id' => $id])
->with('success', '修改成功');
1
2
3
4
5
6
7
@endif @if (session()->has('succes'))
<div class="alert alert-primary">
<ul>
<li>{{ session()->get('succes') }}</li>
</ul>
</div>
@endif

上面也可以用@if(isset($success))
注意with 除了寫 session 他也可以當view 變數名稱

Laravel 有關 with function 那些事情

一直看書看到有很多地方都有用到 with
不仔細看,我還以為他們都是一樣的東西
但是用在不同地方還是不一樣

orm with

之前我有小記,但我沒有用,有空來小記
總結要點:使用 Laravel 開發工具,ORM 查詢的 N + 1 問題 | Laravel China 社區 - 高品質的 Laravel 開發者社區

view with

這個等於 view()第二個參數帶到 blade 去

laravel5-example/resources/views/back/blog at master · bestmomo/laravel5-example

View 資料夾要如何分?
目前我只想到 layout ,page
但官方沒有限制
很多 Project 都不時一樣

laravel5-example/resources/views/back/blog at master · bestmomo/laravel5-example

redirect with

一直以為這個跟 view with 一樣
但是看一下原始碼
他是存在 session(flashdatg 下一個頁面就會清除) ,可以用 old 快速呼叫
原本我以為可以用 create 和 edit 共用同一個 view
但發現難度太高,因為 old(‘name’,\$event->name)
但是在 create 頁面就會掛掉
也許我可以在 create 做一個空event?
有空試試看

withErrors 和 withInput 一樣的道理

action 和 route 選擇

1
2
{{ action('EventController@edit', ['id'=>1]) }}
{{ route('week1.edit', ['id'=>1]) }}

我選擇用 route
打很少字,就算之後要換檔名不用修改很多檔案裡面的內容
可以算是非常方便

用 Laravel Mix 記得加 meta csrf

1
<meta name="csrf-token" content="{{ csrf_token() }}" />

Console.log 好心提醒
CSRF token not found: https://laravel.com/docs/csrf#csrf-x-csrf-token

Laravel 5.x 移除 html helper

不知道為什麼超多人還是有用
laravel 5 Form 和 HTML 的使用 - 袁超 - SegmentFault 思否

DB(ORM) 建立交易

需要抓到外面的變數可以用 use

1
2
3
4
5
6
DB::transaction(function () use ($input, &$is_save) {
$event = new Event($input);
$event->save();
$event->sort = $event->id;
$is_save = $event->save();
});

鎖定資料 Lock · Laravel 5 學習筆記

服務容器

以上兩篇我看完小記的觀點,不一定正確,建議還是看裡面的內容。
我覺得這幾篇講的名詞都很抽象,所以不是很好懂(但是裡面這幾篇算是我找得最清楚的)
先講講我怎麼看裡面容器
我當初以為所有類別都是容器但其實容器應該就是指Container::getInstance這一段類別

更深入了解 Ioc 和 DI 意思
我覺得可以看下面這邊
控制反轉 (IoC) 與 依賴注入 (DI) - NotFalse 技術客

感想
看完有種想把所有東西都塞到容器裡面?
但我後來想想應該不需要
我覺得容器有點像兩個 class 工通橋梁(如 Laravel app())
再透過 Facade 或 helper function 更加方便
同時兩個類別可以呼叫不同 class bind 後的實例

Laravel 如何實現依賴性注入? - 技術保鮮盒 - Medium

Repository

factory /seeder

Laravel - Seeding Many-to-Many Relationship - Stack Overflow

form checkbox

php - laravel 怎么接收和保存一组 checkbox 到数据库? - SegmentFault 思否

控制器依賴注入原理

授權 GATE & Policy

laravel5.5 授权系统 - archer-wong - 博客园

Redis

Laravel 6.2 使用 Redis::get 會遇到

1
Please remove or rename the Redis facade alias in your "app" configuration file in order to avoid collision with the PHP Redis extension.

使用 Cache::put 看似能用,但預設 env 是 file,切換到 redis,還是遇到一樣的問題
看似 Homestead 預設沒安裝 redis 套件
phpredis 需要改裡面程式內容
這邊有兩個做法

  1. 改成用 predis 方法(不推薦)

composer require predis/predis

1 Replace in config\app.php
aliasess:
‘Redis’ => Illuminate\Support\Facades\Redis::class,
for:
‘RedisManager’ => Illuminate\Support\Facades\Redis::class,

2 Replace in config\database.php

‘redis’ => [

‘client’ => env(‘REDIS_CLIENT’, ‘predis’), //default phpredis

參考來源:https://github.com/laravel/horizon/issues/659#issuecomment-528569052

  1. 改成用 phpredis 方法

Homestead 預設沒有安裝 php redis 套件,所以需要手動安裝
不知道新版的 Homestead 會不會預設安裝?
可參考:Homestead 安装 PHP Redis 扩展 | Laravel China 社区 備份圖

相關資料:
Homestead 安装 PHP Redis 扩展 - 菜园子 - SegmentFault 思否
Homestead 环境没有 phpize 怎么安装 Redis 扩展??? | Laravel China 社区
Laravel 6 使用 Redis 注意事项 | Laravel China 社区

Laravel Help

https://stackoverflow.com/questions/58163406/after-upgrading-laravel-from-5-6-to-6-0-call-to-undefined-str-random-function

Laravel Router 多人維護最佳方式

Laravel 分割 routes.php 路由文件的最佳方式 | Laravel China 社区

Laravel blade Javascript 設計

Laravel – 設計一個好的 Blade Template, 使用 @parent | 不怕就是強

一般設計
Jigsaw – Static Sites for Laravel Developers

Laravel 6 安裝 Bootstrap 6

composer require laravel/ui –dev

1
2
3
4
5
6
7
8
9
// Generate basic scaffolding...
php artisan ui bootstrap
php artisan ui vue
php artisan ui react

// Generate login / registration scaffolding...
php artisan ui bootstrap --auth
php artisan ui vue --auth
php artisan ui react --auth

blade

使用 Laravel Navbar 做 selected 設定

1
2
3
4
5
6
7
8
9
10
11
<ul class="nav nav-second-level">
<li class="{{ Request::segment(1) === 'programs' ? 'active' : null }}">
<a href="{{ url('programs' )}}" ></i> Programs</a>
</li>
<li class="{{ Request::segment(1) === 'beneficiaries' ? 'active' : null }}">
<a href="{{url('beneficiaries')}}"> Beneficiaries</a>
</li>
<li class="{{ Request::segment(1) === 'indicators' ? 'active' : null }}">
<a href="{{url('indicators')}}"> Indicators</a>
</li>
</ul>

or

1
2
3
4
5
6
7
8
9
10
11
12
  <div class="container-fluid">
<div class="navbar-header">
<a class="navbar-brand" href="#">WebSiteName</a>
</div>
<ul class="nav navbar-nav">
<li class="{{Request::is('/')?'active':''}}"><a href="{{url('/')}}">Home</a></li>
<li class="{{Request::is('/page1')?'active':''}}"><a href="{{url('/page1')}}">Page 1</a></li>
<li class="{{Request::is('/page2')?'active':''}}"><a href="{{url('/page2')}}">Page 2</a></li>
<li class="{{Request::is('/page3')?'active':''}}"><a href="{{url('/page3')}}">Page 3</a></li>
</ul>
</div>
</nav>

blade section/show

  1. 使用 @section (‘yourSectionName’).....@show。子子孫孫都使用 @section (‘contents’)......@endsection 去繼承實現。

關於 @section...@show;@section....@endsection 的用法分析 | Laravel China 社區

其他

CDN

刷新缓存的方法 - 七牛开发者中心

php - How to save in a polymorphic relationship in Laravel? - Stack Overflow
save() on polymorphic relation don’t work

模型关联 | 《Laravel Nova 中文文档》
[5.1] Saving morphTo relation. · Issue #11918 · laravel/framework
Eloquent 关系图例(译) | Laravel China 社区
laravel Carbon 函数 - 醒来明月 - CSDN 博客
如何使用 K8S 自動化定期 CronJob 抓網路公開資料 | TechBridge 技術共筆部落格
Kubernetes 中的 Job 和 CronJob,批量任务执行 - mark’s technic world - CSDN 博客
onlinereadbook/bookdocker: 線上 docker 讀書會
Repository Pattern and Service Layer – 佛祖球球
Laravel、Ruby on Rails、Django … 使用 Active Record Pattern 框架的最大問題:到底該把 save 寫在哪裡? – Devs.tw
批評 Active Record 的13個論點:最好用也最危險的 Anti-pattern | 轉個彎日誌
(1) Laravel 台灣