laravel Production-ready
php artisan config:cache
Two dimensional Array unique
$goods = [ 1 => [ 'id' => 12, 'price' => 77, ], 2 => [ 'id' => 43, 'price' => 855, ], 4 => [ 'id' => 34, 'price' => 1, ], ]; $goods_unique_ids_keys = array_keys(array_unique(array_column($goods, 'id'))); $goods_filter_datas = array_filter($goods, fn($key) => in_array($key, $goods_unique_ids_keys), ARRAY_FILTER_USE_KEY);
Livewire form and outside form with button action maybe different your think
bladepublic $test_input=1; public function tt() { info('tt'); info($this->test_input); }
So be careful and try to understand<div class="row row-cols-1 row-cols-md-3 g-4" x-data> <form wire:submit="tt"> <input type="text" wire:model='test_input'> <button type="submit">form type=submit</button> {{-- // update (ajax) --}} <button type="button">form type=button</button> {{-- // No update (ajax) --}} <button wire:click='tt; $wire.test_input=3;'>form wire:click</button> {{-- // update (ajax) and run twice --}} <button @click='$wire.tt; $wire.test_input=3;'>form @click</button> {{-- // update (ajax) and run twice --}} </form> <button type="submit">out form type=submit</button> {{-- // No update (ajax) --}} <button type="button">out form type=button</button> {{-- // No update (ajax) --}} <button wire:click='tt; $wire.test_input=3;'>out form wire:click</button> {{-- // update (ajax) --}} <button @click='$wire.tt; $wire.test_input=3;'>out form @click</button> {{-- // update (ajax) --}} </div>
1. what time public variable have value or be set value
2. run twice, not run one.
Codeigniter 4 ORM relation By hand Part 2
namespace App\Traits;
trait ModelTrait
{
// fetaure Maybe belongsTo
// get result but not effect this, keep this ORM status
public function newSelfObject()
{
return $this->db->query($this->builder->getCompiledSelect(false));
}
// copy self object return ORM Object
public function cso()
{
$class_name = get_class($this);
$class_new_object = (new $class_name);
$class_new_object->builder = clone $this->builder;
return $class_new_object;
}
public function hasOne($class, $relation_primary_key=null, $primary_key=null)
{
return $class->where($relation_primary_key ?? $this->primaryKey, $this->newSelfObject()->getRowArray()[$primary_key ?? $this->primaryKey] ?? '');
}
// whereIn If can't get records, return null. Usually use primaryKey cloud happen
public function hasMany($class, $relation_primary_key=null, $primary_key=null)
{
$temp = array_column($this->newSelfObject()->getResult(), $primary_key ?? $this->primaryKey);
return $class->whereIn($relation_primary_key ?? $this->primaryKey, empty($temp) ? [null] : $temp);
}
}
App\Controllers\OrderListContriller.php
namespace App\Controllers\Order;
class OrderListController extends \App\Controllers\BaseController
{
public function OrderList()
{
// 3.
$order = (new Order)->where("id", $order_id);
$orderData = $order->cso()->findAll(); // Maybe need orderData to do something.
$member = $order->members()->where('createtime >', '2022/11/22')->first(); // ->findAll();
}
}
Codeigniter 4 ORM relation By hand
namespace App\Traits;
trait ModelTrait
{
// fetaure Maybe belongsTo
// get result but not effect this, keep this ORM status
public function newSelfObject()
{
return $this->db->query($this->builder->getCompiledSelect(false));
}
public function hasOne($class, $relation_primary_key=null, $primary_key=null)
{
return $class->where($relation_primary_key ?? $this->primaryKey, $this->newSelfObject()->getRowArray()[$primary_key ?? $this->primaryKey] ?? '');
}
// whereIn If can't get records, return null. Usually use primaryKey cloud happen
public function hasMany($class, $relation_primary_key=null, $primary_key=null)
{
$temp = array_column($this->newSelfObject()->getResult(), $primary_key ?? $this->primaryKey);
return $class->whereIn($relation_primary_key ?? $this->primaryKey, empty($temp) ? [null] : $temp);
}
}
How to use
App\Models\Order.php
class Order extends Model
{
use ModelTrait;
protected $table = 'order';
protected $primaryKey = 'order_id';
public function members()
{
return $this->hasMany(new Member);
// OR
return $this->hasMany(new Member, 'id', 'member_id'); // id always use new Member, member_id use Order
}
App\Controllers\OrderListContriller.php
namespace App\Controllers\Order;
class OrderListController extends \App\Controllers\BaseController
{
public function OrderList()
{
// 1. one order
$members = (new Order)->where('id', $order_id)->members()->first(); // ->findAll();
// 2. All orders
$members = (new Order)->members()->findAll();
// 3.
$order = (new Order)->where("id", $order_id);
$orderData = $order->newSelfObject()->getRow(); // Maybe need orderData to do something.
$member = $order->members()->where('createtime >', '2022/11/22')->first(); // ->findAll();
}
}
You can make belongTo or belongsTo by yourself. More about feature like multiple key, it's more complex
SeckillSolution 秒殺 高并發 交易
https://blog.csdn.net/koastal/article/details/78995885
=====
https://blog.csdn.net/qq_38512763/article/details/118830903
Aggregate array values into ranges
// Output:
// Array (
// [0] => Array ( [0] => 1, [1] => 2, [2] => 3, [3] => 4, [4] => 5, [5] => 6 )
// [1] => Array ( [0] => 10, [1] => 11, [2] => 12, [3] => 13 )
// [2] => Array ( [0] => 20 )
// [3] => Array ( [0] => 24 )
// )
static function GetRanges1( $aNumbers ) {
$aNumbers = array_unique( $aNumbers );
sort( $aNumbers );
$aGroups = array();
for( $i = 0; $i < count( $aNumbers ); $i++ ) {
if( $i > 0 && ( $aNumbers[$i-1] == $aNumbers[$i] - 1 ))
array_push( $aGroups[count($aGroups)-1], $aNumbers[$i] );
else
array_push( $aGroups, array( $aNumbers[$i] ));
}
return $aGroups;
}
// Output: Array ( [0] => 1-6, [1] => 10-13, [2] => 20, [3] => 24 )
static function GetRanges2( $aNumbers ) {
$aNumbers = array_unique( $aNumbers );
sort( $aNumbers );
$aGroups = array();
for( $i = 0; $i < count( $aNumbers ); $i++ ) {
if( $i > 0 && ( $aNumbers[$i-1] == $aNumbers[$i] - 1 ))
array_push( $aGroups[count($aGroups)-1], $aNumbers[$i] );
else
array_push( $aGroups, array( $aNumbers[$i] ));
}
$aRanges = array();
foreach( $aGroups as $aGroup ) {
if( count( $aGroup ) == 1 )
$aRanges[] = $aGroup[0];
else
$aRanges[] = $aGroup[0] . '-' . $aGroup[count($aGroup)-1];
}
return $aRanges;
}
// Output: 1~6,10~13,20,24
static function GetRanges3( $aNumbers, $headChar='' ) {
$aNumbers = array_unique( $aNumbers );
sort( $aNumbers );
$aGroups = array();
for( $i = 0; $i < count( $aNumbers ); $i++ ) {
if( $i > 0 && ( $aNumbers[$i-1] == $aNumbers[$i] - 1 ))
array_push( $aGroups[count($aGroups)-1], $aNumbers[$i] );
else
array_push( $aGroups, array( $aNumbers[$i] ));
}
$aRanges = array();
foreach( $aGroups as $aGroup ) {
if( count( $aGroup ) == 1 )
$aRanges[] = $headChar.$aGroup[0];
else
$aRanges[] = $headChar.$aGroup[0] . '~' . $headChar.$aGroup[count($aGroup)-1];
}
return implode( ',', $aRanges );
}
[轉]PHP 8.2 Remove libmysql mysqli
Laravel livewire have Big Problem!
Must have Div At first.
<div style="text-align: center">
<button wire:click="increment">+</button>
<h1>{{ $count }}</h1>
</div>
<div>
<button wire:click="increment">+</button>
<h1>{{ $count }}</h1>
<button class="btn btn-success btn-block" wire:click="create">
{{ trans('global.add') }} {{ trans('cruds.order.title_singular') }}
</button>
</div>
laravel livewire namespace
namespace App\Http\Livewire;
use Gate;
use Livewire\Component;
use Symfony\Component\HttpFoundation\Response;
class Orders extends Component
{
public function render()
{
abort_if(Gate::denies('order_access'), Response::HTTP_FORBIDDEN, '403 Forbidden');
return view('livewire.order');
}
}
resources/views/livewire/order.blade.php
@extends('layouts.app')
@section('content')
@livewire('order.show')
@endsection
App/Http/Livewire/Order/Show.php
namespace App\Http\Livewire\Order;
public function render()
{
abort_if(Gate::denies('order_access'), Response::HTTP_FORBIDDEN, '403 Forbidden');
$this->orders = Order::all();
// Order::where('owner_id', auth()->id())->get(); // 只能看自己
return view('livewire.order.show');
}
resources/views/livewire/order/show.blade.php
{{ virables }}
laravel eloquent orm
[one to one]
Table: User, Phone
Model: User
Relation: return $this->hasOne('App\Phone');
Talbe Phone need have user_id. Auto use User id -> Phone user_id
Table: User, Phone
Model: Phone
Relaion: return $this->belongsTo('App\User');
Table Phone need have user_id. Auto use User id -> User user_id
[one to many]
Table: Post, Comment
Model: Post
Relation: return $this->hasMany('App\Comment');
Table Comment need have post_id. Auto use Post id -> Comment post_id
Table: Post, Comment
Model: Comment
Relaion: return $this->belongsTo('App\Post');
Table Comment need have post_id. Auto Post id -> Comment post_id
[Many To Many]
Table: User, Role, Role_User
Table Role_User must have user_id, role_id
Model: User
way1:
Relaion: return $this->belongsToMany('App\Role', 'role_user');
way2:
Relaion: return $this->belongsToMany('App\Role');
Must database/migrations defined talbe class like "CreateRoleUserPivotTable"
livewire laravel route problem!
protected $namespace = 'App\Http\Controllers';
...
$this->routes(function () {
Route::prefix('api')
->middleware('api')
->namespace($this->namespace)
->group(base_path('routes/api.php'));
Route::middleware('web')
->namespace($this->namespace)
->group(base_path('routes/web.php'));
});
Add backup namespace then get problem for livewire. Every route just use App\Http|controllers ooxxooxxooxx.
OLD Way
web.php
Route::resource('users', 'UsersController');
Route::delete('users/destroy', 'UsersController@massDestroy');
Get Error
Route::resource('orders', 'livewire.order');
Route::resource('orders', 'livewire@order');
Route::view('orders', [\App\Http\Livewire\Order::class, 'render']);
Maybe Way
web.php
Route::view('orders', 'livewire.order');
Files:
\app\Http\Livewire\Order.php inside use return view('livewire.order');
\resources\views\livewire\order.blade.php
Get Error
Undefined variable: orders or other ooxxooxx
Alwasy get this Error.
web.php
Route::get('/admin/orders', [\App\Http\Livewire\Order::class, 'render']);
Files:
\app\Http\Livewire\Order.php
And use
return <<<'blade'
blade;
Get plain text @foreach($orders as o$key -> $permission
Same Error.
Beacuse view run first. Only create view then @livewire('')
example:order and orderlist order view for fist(main) load page. orderlist be loaded by order view. order view have @livewire('orderlist'). https://stackoverflow.com/questions/64038485/laravel-livewire-components-or-controllers
or just remove namespace
Route::get('/admin/orders', \App\Http\Livewire\Order::class);
Don't add namespace in app/Http/livewire/ any file. Always get errors.
php auth role is_admin isAdmin or .... check role admin
public function getIsAdminAttribute()
{
return (bool) $this->admin;
}
Auth::user()->isAdmin or auth()->user()->isAdmin
https://laracasts.com/discuss/channels/code-review/how-to-check-user-role-after-login
namespace App;
use App\Role;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
public function getIsAdminAttribute()
{
return $this->roles->pluck( 'name' )->contains( 'admin' );
}
public function roles()
{
// you will need a role model
// Role::class is equivalent to string 'App\Role'
return $this->belongsToMany( Role::class, 'users_role' );
}
}
LoginController
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Auth;
use Input;
use Validator;
use Redirect;
class LoginController extends Controller
{
//
public function login_post( Request $request )
{
$data = Input::except( array( '_token' ) );
// var_dump($data);
$rule = array(
'email' => 'required|email',
'password' => 'required',
);
$validator = Validator::make( $data, $rule );
if ($validator->fails()) {
// should do something
} else {
// no need to populate $data again with the same values
// $data = Input::except( array( '_token' ) );
if (Auth::attempt( $data )) {
// here i want to check logged in user role
$user = Auth::user();
if ($user->roles->pluck( 'name' )->contains( 'admin' )) {
return Redirect::to( '/admin-dashboard' );
}
return Redirect::to( '/dashboard' );
}
}
}
}
https://laravel.tw/docs/5.2/eloquent-serialization#appending-values-to-json
https://codertw.com/%E7%A8%8B%E5%BC%8F%E8%AA%9E%E8%A8%80/111359/
方法簽名為getXXXAttribute get XXX Attribute So XXX => IsAdmin
public function getIsAdminAttribute()
{
return $this->roles()->where('id', 1)->exists();
}
https://stackoverflow.com/questions/44017571/pass-current-eloquent-into-getxattribute-in-model
public function getIsAdminAttribute()
{
return Admin::where('user_id', $this->id)->count() > 0;
}
Error Running: npm install vue-template-compiler --save-dev --production=false
Error
Additional dependencies must be installed. This will only take a moment.
Running: npm install vue-template-compiler --save-dev --production=false
https://qiita.com/ucan-lab/items/f5bcdfceecffb9def4c5
Use yarn, Not npm
yarn add vue-template-compiler --dev --production=false
yarn run dev
php laravel UI Boostrap jetstream docker-compose
docker-compose up -d
docker-compose exec app composer create-project --prefer-dist laravel/laravel .
== jetstream Livewire !Now No Use
docker-compose exec app composer require laravel/jetstream
docker-compose exec app php artisan jetstream:install livewire --teams
docker-compose exec app php artisan migrate
docker-compose exec web yarn install
docker-compose exec web yarn dev
== jetstream end
== Laravel UI Bootstrap Auth *more easy
docker-compose exec app composer require laravel/ui
docker-compose exec app php artisan ui bootstrap --auth
[ docker-compose exec app php artisan migrate ]
docker-compose exec web yarn install
docker-compose exec web yarn run dev
[ docker-compose exec web yarn add vue-template-compiler --dev --production=false ]
== Laravel UI Bootstrap end
docker-compose exec app composer require doctrine/dbal
docker-compose exec app composer require --dev barryvdh/laravel-ide-helper
docker-compose exec app composer require --dev beyondcode/laravel-dump-server
docker-compose exec app composer require --dev barryvdh/laravel-debugbar
docker-compose exec app composer require --dev roave/security-advisories:dev-master
docker-compose exec app php artisan vendor:publish --provider="BeyondCode\DumpServer\DumpServerServiceProvider"
docker-compose exec app php artisan vendor:publish --provider="Barryvdh\Debugbar\ServiceProvider"
=== remove all
docker-compose down --rmi all --volumes
docker-compose down --volumes
.參考:
blade @can @cannot
https://laravel.com/docs/8.x/authorization#via-blade-templates
https://laravel.com/docs/8.x/authorization