Lavarel의 첫 만남
46337 단어 php 프레임워크
Route::get('foo', function () {
return 'Hello World';
});
2 기본 모드
Route::get/post/put/delete('/user', 'UsersController@index');
다양한 요청 방법 일치
match
Route::match(['get', 'post'], '/', function () {
//
});
any
Route::any('foo', function () {
//
});
POST, PUT 또는 DELETE 요청 방식에는 CSRF 토큰이 포함되어야 합니다. 그렇지 않으면 거부됩니다.
3 라우팅 리디렉션
Route::redirect('/here', '/there', 301);
4 뷰 라우팅
redirect , 。view , , URL 。 , , 。
Route::view('/welcome', 'welcome', ['name' => 'Taylor']);
루트 매개 변수 (매개 변수는 {}에 쓰여 있으며, 알파벳 밑줄로만 명명할 수 있습니다)
필수 매개 변수
Route::get('posts/{post}/comments/{comment}', function ($postId, $commentId) {
//
});
선택적 매개변수(매개변수 뒤에? 기호를 추가하여 기본값이 있는지 확인)
Route::get('user/{name?}', function ($name = 'John') {
return $name;
});
뒤에 where가 파라미터 값을 구속할 수 있는 유형을 추가합니다
Route::get('user/{id}', function ($id) {
//
})->where('id', '[0-9]+');
매개변수의 글로벌 구속조건(이 매개변수의 모든 라우팅에 적용됨)
pattern RouteServiceProvider boot :
/**
* , pattern 。
*
* @return void
*/
public function boot()
{
Route::pattern('id', '[0-9]+');
parent::boot();
}
라우팅 이름 지정
URL 。 name :
Route::get('user/profile', function () {
//
})->name('profile');
:
Route::get('user/profile', 'UserController@showProfile')->name('profile');
Route::get('user/{id}/profile', function ($id) {
//
})->name('profile');
$url = route('profile', ['id' => 1]);
if ($request->route()->named('profile')) {
//
}
라우팅 그룹
1 , group middleware .
Route::middleware(['first', 'second'])->group(function () {
Route::get('/', function () {
// first second
});
Route::get('user/profile', function () {
// first second
});
});
2
namespace PHP :
Route::namespace('Admin')->group(function () {
// "App\Http\Controllers\Admin"
});
, ,RouteServiceProvider , App\Http\Controllers 。 , App\Http\Controllers 。
중간(lavarel은 HTTP 요청을 중간부품으로 필터링)
Laravel , 、CSRF 。 app/Http/Middleware 。
:php artisan make:middleware CheckAge
app/Http/Middleware CheckAge 。 , age 200 。 , home
namespace App\Http\Middleware;
use Closure;
class CheckAge
{
/**
*
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if ($request->age <= 200) {
return redirect('home');
}
return $next($request);
}
}
, age 200, HTTP ; , 。 ( 「 」 ), $request $next
。 ,
셋.CSRF
Laravel CSRF「 」。
CSRF url
routes/web.php , RouteServiceProvider web 。 , URI VerifyCsrfToken $except CSRF
class VerifyCsrfToken extends BaseVerifier
{
/**
* URI CSRF
*
* @var array
*/
protected $except = [
'stripe/*',
];
}
POST CSRF ,VerifyCsrfToken X-CSRF-TOKEN 。 HTML meta :
"csrf-token" content="{{ csrf_token() }}">
jQuery 。 AJAX 、 CSRF :
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}
});
4 요청 매개 변수 1 주입에 의존하는 방식
public function store(Request $request)
{
$name = $request->input('name');
//
}
2 라우팅에서 가져오기
public function update(Request $request, $id)
{
//
}
url 가져오기
// Without Query String...
$url = $request->url();
// With Query String...
$url = $request->fullUrl();
요청 경로 가져오기
$uri = $request->path();
$method = $request->method();
if ($request->isMethod('post')) {
//
}
오.호응하다
response()->
여섯.뷰
Route::get('/', function () {
return view('greeting', ['name' => 'James']);
});
return view('greeting')->with('name', 'Victoria');
boot Facade share 。 , AppServiceProvider
일곱확인
$this->validate($request, [
'title' => 'required|unique:posts|max:255',
'body' => 'required',
]);
$this->validate($request, [
'title' => 'bail|required|unique:posts|max:255',
'body' => 'required',
]);
, title unique, max 。 。
, . key
$this->validate($request, [
'title' => 'required|unique:posts|max:255',
'author.name' => 'required',
'author.description' => 'required',
]);
GET 。 Lavarel Session , ( )。 $errors Illuminate\Support\MessageBag 。 , 。
$errors Web Illuminate\View\Middleware\ShareErrorsFromSession 。 , $error , $errors 。
폼 요청 클래스 (더욱 복잡한 검증에 적응)
public function rules()
{
return [
'title' => 'required|unique:posts|max:255',
'body' => 'required',
];
}
오류 메시지
public function messages()
{
return [
'title.required' => 'A title is required',
'body.required' => 'A message is required',
];
}
데이터베이스 1.기본 Sql 쿼리
$users = DB::select('select * from users where active = ?', [1]);
$affected = DB::update('update users set votes = 100 where name = ?', ['John']);
2. 조회 구조기
$users = DB::table('users')->get();
$user = DB::table('users')->where('name', 'John')->first();
특정 필드의 값 가져오기(pluck 사용)
$roles = DB::table('roles')->pluck('title', 'name');
블록 분리(chunk)
DB::table('users')->orderBy('id')->chunk(100, function ($users) {
foreach ($users as $user) {
//
}
});
return false
DB::table('users')->orderBy('id')->chunk(100, function ($users) {
// Process the records...
return false;
});
체인 방법 뒤에 직접 집합 조회를 할 수 있다
count、 max、 min、 avg sum
$price = DB::table('orders')->max('price');
$price = DB::table('orders')
->where('finalized', 1)
->avg('price');
필요한 필드 대비만 조회 (chunk)
$users = DB::table('users')->select('name', 'email as user_email')->get();
무거움
$users = DB::table('users')->distinct()->get();
이미 알고 있는 구조 검색기에서 검색의 필드를 추가합니다
$query = DB::table('users')->select('name');
$users = $query->addSelect('age')->get();
관련 질의 1.inner join
$users = DB::table('users')
->join('contacts', 'users.id', '=', 'contacts.user_id')
->join('orders', 'users.id', '=', 'orders.user_id')
->select('users.*', 'contacts.phone', 'orders.price')
->get();
2.left join
$users = DB::table('users')
->leftJoin('posts', 'users.id', '=', 'posts.user_id')
->get()
3. 클로즈업 형식의join용법
DB::table('users')
->join('contacts', function ($join) {
$join->on('users.id', '=', 'contacts.user_id')->orOn(...);
})
->get();
흔히 볼 수 있는 체인 방법
블록 컨텐트 참조
where or whereBetween whereNotBetween
whereIn whereNotIn whereNull whereNotNull
whereDate / whereMonth / whereDay / whereYear
whereColumn Where Exists
DB::table('users')
->whereExists(function ($query) {
$query->select(DB::raw(1))
->from('orders')
->whereRaw('orders.user_id = users.id');
})
->get();
select * from users
where exists (
select 1 from orders where orders.user_id = users.id
)
orderBy latest / oldest inRandomOrder
groupBy / having / havingRaw
skip / take
skip take :
$users = DB::table('users')->skip(10)->take(5)->get();
, limit offset :
$users = DB::table('users')
->offset(10)
->limit(5)
->get();
조건이 성립되었을 때 검색을 실행합니다 (when)
$users = DB::table('users')
->when($sortBy, function ($query) use ($sortBy) {
return $query->orderBy($sortBy);
}, function ($query) {
return $query->orderBy('name');
})
->get();
삽입
DB::table('users')->insert([
['email' => '[email protected]', 'votes' => 0],
['email' => '[email protected]', 'votes' => 0]
]);
Id(insertGetId)
$id = DB::table('users')->insertGetId(
['email' => '[email protected]', 'votes' => 0]
);
Upload
DB::table('users')
->where('id', 1)
->update(['votes' => 1]);
DB::table('users')->increment('votes', 5);
DB::table('users')->decrement('votes');
자동 증가와 동시에 다른 필드를 업데이트할 수 있습니다
DB::table('users')->increment('votes', 1, ['name' => 'John']);
delete
DB::table('users')->delete();
DB::table('users')->where('votes', '>', 100)->delete();
시계를 비우다
DB::table('users')->truncate();
비관 자물쇠?what
select 「 」 。 「 」, sharedLock 。 , :
페이지 나누기
페이지당 15개
$users = DB::table('users')->paginate(15);
이전 페이지 다음 페이지만 지원
$users = DB::table('users')->simplePaginate(15);
Laravel groupBy 。 groupBy,
모델
1. 모델 자동 생성
:php artisan make:model User
php artisan make:model User --migration
php artisan make:model User -m
class Flight extends Model
{
/**
*
*
* @var string
*/
protected $table = 'my_flights';// Flight Flights
}
메인 키
Eloquent id 。 $primaryKey 。 ,Eloquent , int。 , public $incrementing false
타임 스탬프
,Eloquent created_at updated_at 。 Eloquent , $timestamps false
데이터베이스 연결
, Eloquent 。 , $connection
protected $connection = 'connection-name';
모델 조회
$flights = App\Flight::all();
$flights = App\Flight::where('active', 1)
->orderBy('name', 'desc')
->take(10)
->get();
Eloquent , 。 Eloquent
블록 처리, 조회 구조기의 Chunk와 유사하며, 여기서는 클로즈업 모드를 사용합니다
Flight::chunk(200, function ($flights) {
foreach ($flights as $flight) {
//
}
});
단일 모델/컬렉션 가져오기
// ...
$flight = App\Flight::find(1);
$flights = App\Flight::find([1, 2, 3]);
// ...
$flight = App\Flight::where('active', 1)->first();
질의에 대한 결과 자동 반환 예외
$model = App\Flight::where('legs', '>', 100)->firstOrFail();
취합
count、sum、max...
$count = App\Flight::where('active', 1)->count();
$max = App\Flight::where('active', 1)->max('price');
기본 추가
, , save :
public function store(Request $request)
{
// ...
$flight = new Flight;
$flight->name = $request->name;
$flight->save();
}
save ,created_at updated_at , 。
기본 업데이트
, , , save 。 ,updated_at , :
$flight = App\Flight::find(1);
$flight->name = 'New Flight Name';
$flight->save();
대량 업데이트
App\Flight::where('active', 1)
->where('destination', 'San Diego')
->update(['delayed' => 1]);
모델 생성 또는 업데이트
, , ,Laravel updateOrCreate , firstOrCreate , updateOrCreate , save() :
$flight = App\Flight::updateOrCreate(
['departure' => 'Oakland', 'destination' => 'San Diego'],
['price' => 99]
);
삭제
기본 삭제
$flight = App\Flight::find(1);
$flight->delete();
주 키를 통해 삭제
App\Flight::destroy(1);
App\Flight::destroy([1, 2, 3]);
App\Flight::destroy(1, 2, 3);
여러 삭제
$deletedRows = App\Flight::where('active', 0)->delete();
Illuminate\Database\Eloquent\SoftDeletes trait deleted_at $dates :
class Flight extends Model
{
use SoftDeletes;
/**
* 。
*
* @var array
*/
protected $dates = ['deleted_at'];
}
, deleted_at 。Laravel :
Schema::table('flights', function ($table) {
$table->softDeletes();
});
,
$flight->history()->withTrashed()->get();//
$flights = App\Flight::onlyTrashed()
->where('airline_id', 1)
->get();
$flight->restore();
App\Flight::withTrashed()
->where('airline_id', 1)
->restore();
// ...
$flight->forceDelete();
// ...
$flight->history()->forceDelete();
연관 모델
public function user()
{
return $this->belongsTo('App\User');
}
return $this->hasOne('App\Phone', 'foreign_key');
일대다
public function comments()
{
return $this->hasMany('App\Comment');
}
public function post()
{
return $this->belongsTo('App\Post');
}