Showing results for “php”

12 results found

  • วิธีรัน Laravel บนแชร์โฮส แบบไม่ต้อง /public

    Topic
    Save Pongsiri 2 weeks ago

    เมื่อเราต้องอัปโปรเจค Laravel ของเราขึ้นไปโฮสที่เป็นแชร์โฮสที่มีโฟลเดอร์ public_html มาให้เราอัพเว็บได้อย่างเดียว สิ่งที่เราต้องทำคือ ถ้าเราสามารถอัปไฟล์นอกโฟลเดอร์ public_html ได้ เราก็อัปขึ้นไปที่โฟลเดอร์นอก public_html แล้วเปลี่ยนชื่อโฟลเดอร์ public ใน laravel เป็น public_html แทนก็ได้ แต่ถ้าเราไม่มีสิทธิ์อัปไฟล์นอกโฟลเดอร์ public_html แล้วละก็ ให้ใช้วิธีนี้เป็นวิธีสุดท้าย (เพราะความปลอดภัยมันน้อยกว่า)1. ย้ายทุกอย่างจากโฟลเดอร์ /public ออกมาอยู่ในโฟลเดอร์โปรเจค 2. เปิดไฟล์ index.php ขึ้นมา แล้วแก้ไขตามนี้require __DIR__.'/bootstrap/autoload.php';$app = require_once DIR.'/../bootstrap/app.php';

  • วิธีแก้ปัญหา SoftException writable by group

    Topic
    Save Pongsiri 3 months ago

    สำหรับใครที่ใช้ centos แล้วอัพเว็บขึ้นด้วย git พอ cloneโปรเจคมาแล้วปรากฎว่าเว็บรันไม่ได้ขึ้น internal error 500 ลองเข้าไปเช็ค error log เจอข้อความแบบนี้SoftException in Application.cpp:256: File "/home/username/public_html/index.php" is writeable by groupวิธีแก้คือ1. แก้ไขไฟล์ ~/.bash_profile เพิ่มบรรทัดนี้ลงไปumask 0222. เปลี่ยน permission ให้กับทุกไฟล์และโฟลเดอร์เป็น 755chmod -R 755

  • วิธีเซ็ต .htaccess เมื่ออัพ laravel ขึ้น cPanel

    Topic
    Save Pongsiri 3 months ago

    cPanel ใช้ apache เป็นเว็บเซิร์ฟเวอร์อยู่แล้วดังนั้นแก้ไขไฟล์ .htaccessRewriteEngine OnOptions +FollowSymLinksRewriteCond %{REQUEST_FILENAME} !-dRewriteCond %{REQUEST_FILENAME} !-fRewriteRule ^ index.php [L]RewriteRule ^(.*)$ public/$1 [L]

  • ติดตั้ง php บน macos ด้วย brew

    Topic
    Save Pongsiri 4 months ago

    First install Brew on your MACSetup Brew: ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"brew updatebrew tap homebrew/dupesbrew tap homebrew/phpInstall PHP 7.0.+ brew install php70Install mcrypt: brew install mcrypt php70-mcryptFinally, install composer: brew install composerNow if you run $ php -v, you will get PHP 5.5 or something. This is the default PHP version that is shipped with OSX and cannot be removed. You just need to edit your path to ensure that PHP 7.0 is picked up.export PATH="$(brew --prefix homebrew/php/php70)/bin:$PATH"To debug any issue with any package, you can run brew info php70 etc.Also, if you are getting seemingly unrelated errors, make sure to update bash/zsh: brew upgrade bash and brew upgrade zsh.If everything is setup correctly, running $ php -v should give you 7.0.+.Thank! https://gist.github.com/shashankmehta/6ff13acd60f449eea6311cba4aae900a

  • Laravel วิธีตั้งค่าให้เป็น https เมื่ออยู่บน production

    Topic
    Save Pongsiri 4 months ago

    <?phpnamespace App\Providers; ...use Illuminate\Support\Facades\Schema;... class AppServiceProvider extends ServiceProvider{    /**     * Bootstrap any application services.     *     * @return void     */    public function boot()    {        ...    }    /**     * Register any application services.     *     * @return void     */    public function register()    {         if (config('app.env') == 'production') {            $this->app['url']->forceScheme('https');        }    }}

  • วิธีรัน serve ของ laravel ให้เครื่องอื่นเปิดดูได้

    Topic
    Save Pongsiri 4 months ago

    sudo php artisan serve --host 192.168.1.101 --port 80

  • วิธีแก้ปัญหา paginator หน้าอื่นๆ ไม่เป็น https ใน laravel

    Article
    Save Pongsiri 5 months ago

    กรณีนี้เกิดจาก forceSchema('https') ที่เราตั้งค่าไว้เพื่อให้เปลี่ยนทุกอย่างเป็น https มันไม่ส่งผลกับ url ใน paginator เมื่อมันมีพวก X-FORWARDED อยู่นะสิ ดังนั้นทางแก้ของเราก็คือสร้าง middleware ขึ้นมาสำหรับตั้งค่าเชื่อถือ Proxy ของเราครับตั้งชื่อไฟล์ app/Http/Middleware/HttpsProtocol.phpแล้วก็ไปบอก Kernel.php ให้รู้จักกันซะ ที่ไฟล์ app/Http/Kernel.php

  • เปิดโหมด Debug ใน wordpress

    Topic
    Save Pongsiri 5 months ago

    ตั้งค่าที่ไฟล์ wp-config.php define('WP_DEBUG', true);

  • ดึง RSS ฟีดมาแสดงใน Laravel

    Article
    Save Pongsiri 5 months ago

    ใครที่ใช้ Laravel 5 และกำลังหาวิธีดึง RSS ฟีดมาแสดงที่เว็บของเรา  วันนี้ผมขอแนะนำแพคเกจ willvincent/feeds ที่ช่วยให้คุณตอบสนองความต้องการนั้นครับติดตั้ง willvincent/feedsใช้คำสั่ง composer require ดาวน์โหลดแพจเกจ willvincent/feeds ลงในโปรเจค Laravel 5 ของเราก่อนครับ composer require willvincent/feedsแล้วก็เข้าไปเพิ่ม provider ในไฟล์ config/app.php     'providers' => [        // ...        willvincent\Feeds\FeedsServiceProvider::class,    ],และเพิ่ม faces ลงในส่วนของ aliases ในไฟล์เดียวกัน    'aliases' => [        // ...        'Feeds'    => willvincent\Feeds\Facades\FeedsFacade::class,    ],ก่อนใช้งานเราก็ต้องดึง config ของแพคเกจออกมาก่อนครับphp artisan vendor:publish --provider="willvincent\Feeds\FeedsServiceProvider"เสร็จแล้วจะไฟล์ config/feeds.php กำเนิดเกิดขึ้น (ถ้าใครไม่ขึ้นหรือรันไม่ผ่านให้ลองรันคำสั่งล้างแคชก่อนนะ php artisan config:cache)การใช้งานใน Controllerเราจะใช้งานด้วยฟังก์ชั่น make()  ซึ่ง 3 พารามิเตอร์- ลิงค์ของ RSS ถ้ามีหลายลิงค์ให้ใส่เป็น array- ตัวเลขจำนวนฟีดที่แสดงไม่เกินกี่ฟีด- บังคับอ่านไฟล์ที่ไม่ถูกรูปแบบ RSS ใส่เป็น Booleanเริ่มด้วยกันเรียกใช้งานคลาสด้วย faces ที่เราเตรียมไว้ส่วนบนๆ ของ controller เราเลยครับ ... use Feeds; class FeedsController extends Controller{     ... }    โค้ดตัวอย่างนี้ เราจะเขียน method สำหรับอ่านข้อมูลจากลิงค์ RSS มาแปลงเป็น array แล้วส่งต่อไปแสดงผลที่ View ครับ    public function news()    {        $feed = Feeds::make('https://www.thaiware.com/rss/rss_latestPost_news.php');        $data = array(          'title'     => $feed->get_title(),          'permalink' => $feed->get_permalink(),          'items'     => $feed->get_items(),        );        return view('feeds', $data);    }ในส่วนของ views/feeds.blade.php เราจะลูป Feeds จาก controller มาแสดงครับ  <h1><a href="{{ $permalink }}">{{ $title }}</a></h1>  @foreach ($items as $item)    <div class="item">       <img alt="Image" src="{{ $item->get_enclosure()->link }}">           <h2><a href="{{ $item->get_permalink() }}">{{ $item->get_title() }}</a></h2>      <p>{{ $item->get_description() }}</p>      <p><small>Posted on {{ $item->get_date('j F Y | g:i a') }}</small></p>    </div>  @endforeachปล. สามารถดูตัวอย่างผลลัพธ์ของโค้ดด้านบนได้เลยที่หน้า RSS ฟีดของไอเดียจิตอลครับ https://www.ideagital.com/news 

  • การใช้งาน Laratrust ตัวจัดการเรื่องสิทธิ์การใช้งาน (ACL)

    Article
    Save Pongsiri 6 months ago

    หลังจากบทความที่แล้วได้เขียนถึงการติดตั้ง Laratust และตั้งค่ากันเรียบร้อยแล้ว บทความนี้ก็เลยต่อเนื่องมาเขียนถึงวิธีใช้งาน Laratrust ทั้งหมดเลยครับก่อนจะไปพูดถึงการใช้งาน Laratrust สิ่งที่เราต้องรู้จักก่อนก็คือความหมายของแต่ละคำที่เราจะเจอก่อน1. Role คือ ชื่อของบทบาทหน้าที่โดยรวม เช่น admin2. Permission คือ ชื่อของสิทธิ์ที่มีในแต่ละบทบาท เช่น admin นั้นมีสิทธิ์ในการทำอะไรได้บ้าง เช่น 'create-user', 'update-post' เป็นต้น การสร้างและใช้งาน Role, Permissionการสร้าง Role$owner = new Role();$owner->name         = 'owner';$owner->display_name = 'Project Owner';$owner->description  = 'User is the owner of a given project';$owner->save(); $admin = new Role();$admin->name         = 'admin';$admin->display_name = 'User Administrator';$admin->description  = 'User is allowed to manage and edit other users';$admin->save();การสร้าง Permission $createPost = new Permission();$createPost->name         = 'create-post';$createPost->display_name = 'Create Posts';$createPost->description  = 'create new blog posts';$createPost->save(); $editUser = new Permission();$editUser->name         = 'edit-user';$editUser->display_name = 'Edit Users';$editUser->description  = 'edit existing users';$editUser->save();การเพิ่ม Permission ให้กับแต่ละ Role$admin->attachPermission($createPost);//หรือ $admin->permissions()->attach([$createPost->id]); $owner->attachPermissions([$createPost, $editUser]);//หรือ $owner->permissions()->attach([$createPost->id, $editUser->id]); $owner->syncPermissions([$createPost, $editUser]);//หรือ $owner->permissions()->sync([$createPost->id, $editUser->id]);การลบ Permission ออกจาก Role$admin->detachPermission($createPost);//หรือ $admin->permissions()->detach([$createPost->id]); $owner->detachPermissions([$createPost, $editUser]);//หรือ $owner->permissions()->detach([$createPost->id, $editUser->id]);การเพิ่ม Role ให้กับ User แต่ละคน$user->attachRole($admin);//หรือ $user->roles()->attach([$admin->id]); $user->attachRoles([$admin, $owner]);//หรือ $user->roles()->attach([$admin->id, $owner->id]); $user->syncRoles([$admin->id, $owner->id]);//หรือ $user->roles()->sync([$admin->id, $owner->id]); $user->syncRolesWithoutDetaching([$admin->id, $owner->id]);//หรือ $user->roles()->syncWithoutDetaching([$admin->id, $owner->id]);การลบ Role ออกจาก User แต่ละคน$user->detachRole($admin);//หรือ $user->roles()->detach([$admin->id]); $user->detachRoles([$admin, $owner]);//หรือ $user->roles()->detach([$admin->id, $owner->id]);การเพิ่ม Permission ให้กับ User แต่ละคน$user->attachPermission($editUser);//หรือ $user->permissions()->attach([$editUser->id]); $user->attachPermissions([$editUser, $createPost]);//หรือ $user->permissions()->attach([$editUser->id, $createPost->id]); $user->syncPermissions([$editUser->id, $createPost->id]);//หรือ $user->permissions()->sync([$editUser->id, createPost->id]); $user->syncPermissionsWithoutDetaching([$editUser, $createPost]);//หรือ $user->permissions()->syncWithoutDetaching([$createPost->id, $editUser->id]);การลบ Permission ออกจาก User แต่ละคน$user->detachPermission($createPost);//หรือ $user->roles()->detach([$createPost->id]); $user->detachPermissions([$createPost, $editUser]);//หรือ $user->roles()->detach([$createPost->id, $editUser->id]);การเช็ค Role และสิทธิ์ของผู้ใช้แต่ละคนให้ใช้ method จากตัวแปล $user ที่เราต้อง หรือ auth() ที่กำลัง login อยู่ตามตัวอย่าง$user->hasRole('owner');   // false$user->hasRole('admin');   // true $user->can('edit-user');   // false$user->can('create-post'); // trueทั้ง can() และ hasRole() สามารถเช็คทีเดียวได้หลายค่าด้วยอาเรย์ครับ$user->hasRole(['owner', 'admin']);       // true$user->can(['edit-user', 'create-post']); // true $user->hasRole('owner|admin');       // true$user->can('edit-user|create-post'); // trueและถ้าเราต้องการให้เช็คว่าต้องเข้าเงื่อนไขทั้งหมดเลยก็ให้เติม true ลงไปในพารามิเตอร์ที่ 2$user->hasRole(['owner', 'admin']);             // true$user->hasRole(['owner', 'admin'], true);       // false, กรณี user ไม่ได้เป็น admin $user->can(['edit-user', 'create-post']);       // true$user->can(['edit-user', 'create-post'], true); // false, กรณี user ไม่มีสิทธิ์ edit-userที่พิเศษกว่านั้นคือเราสามารถเช็คแบบกว้าง ๆ ได้แบบนี้ด้วย// match any admin permission$user->can('admin.*'); // true // match any permission about users$user->can('*_users'); // trueและ can() สามารถเรียกแบบสวยแบบนี้ก็ได้$user->canCreateUsers();// เหมือนกับ $user->can('create-users');เช็คด้วย ability()ฟังก์ชั่นนี้ใช้เช็ครวดเดียวเลยทั้ง Role, Permission ของผู้ใช้ การใช้งานมี 3 พารามิเตอร์ คือ (roles, permissions, options)โดยเราสามารถเช็คได้หลายเงื่อนไขด้วยการใช้ | ในการแบ่งคำ หรือเขียนแบบอาเรย์ก็ได้$user->ability(['admin', 'owner'], ['create-post', 'edit-user']);// หรือ$user->ability('admin|owner', 'create-post|edit-user');พารามิเตอร์ที่ 3 เป็นอาเรย์ options $options = [    'validate_all' => true | false (Default: false),    'return_type'  => boolean | array | both (Default: boolean)];- validate_all    คือต้องเข้าเงื่อนไขทั้งหมด (ค่าเริ่มต้นเป็น false)- return_type    เซ็ตว่าจะให้ return ค่ากลับมาเป็นแบบ boolean หรือ array (ค่าเริ่มต้นเป็น boolean)ตัวอย่างการใช้งาน$options = [    'validate_all' => true,    'return_type' => 'both']; list($validate, $allValidations) = $user->ability(    ['admin', 'owner'],    ['create-post', 'edit-user'],    $options); var_dump($validate);// bool(false) var_dump($allValidations);// array(4) {//     ['role'] => bool(true)//     ['role_2'] => bool(false)//     ['create-post'] => bool(true)//     ['edit-user'] => bool(false)// }การเรียกข้อมูลที่สัมพันธ์กันถ้าเราต้องการดึงสิทธิ์ของ user มาทั้งหมด สามารถทำได้โดยใช้เมธอด allPermissions จะได้ permission ทั้งหมดที่ user คนนั้นมีจากทุก roles ด้วยdump($user->allPermissions());/* Illuminate\Database\Eloquent\Collection {#646  #items: array:2 [    0 => App\Permission {#662      ...      #attributes: array:6 [        "id" => "1"        "name" => "edit-users"        "display_name" => "Edit Users"        "description" => null        "created_at" => "2017-06-19 04:58:30"        "updated_at" => "2017-06-19 04:58:30"      ]      ...    }    1 => App\Permission {#667      ...      #attributes: array:6 [        "id" => "2"        "name" => "manage-users"        "display_name" => "Manage Users"        "description" => null        "created_at" => "2017-06-19 04:58:30"        "updated_at" => "2017-06-19 04:58:30"      ]      ...    }  ]} */ถ้าเราต้องการดูรายชื่อ user ที่มี role บางอย่าง เช่น admin สามารถทำได้โดยการใช้ query scope ชื่อ whereRoleIs()$users = User::whereRoleIs('admin')->get();ดู user ที่มี permissions บางอย่างได้ด้วยเช่นกัน ด้วย scope ชื่อ wherePermissionIs()$users = User::wherePermissionIs('edit-user')->get();เช็คว่าเป็นเจ้าของมั้ยสมมติว่าต้องการเช็คว่า user นี้เป็นเจ้าของ post ที่จะแก้ไขหรือเปล่า ก็สามารถทำได้ครับ โดยใช้ฟังก์ชั่น owns()public function update (Post $post) {    if ($user->owns($post)) { //บรรทัดนี้จะตรวจว่ามี 'user_id' อยู่ใน $post หรือไม่       abort(403);    }    ...}ถ้าในตาราง posts เราใช้ key ของเจ้าของเป็นชื่ออื่นที่ไม่ใช่ user_id เราสามารถระบุชื่อ filed ของเราเองในแอททรีบิวต์ที่ 2$user->owns($post, 'idUser');เช็คสิทธิ์และความเป็นเจ้าของถ้าเราต้องการเช็คสิทธ์พร้อมกับเช็คด้วยว่า user เป็นเจ้าของ object นั้นหรือเปล่า เราสามารถทำได้โดยการใช้ method ชื่อว่า canAndOwns และ hasRoleAndOwnsทั้ง 2 method จะมี 3 พารามิเตอร์- permission หรือ role คือเช็คว่ามีสิทธิ์หรือมี role นั้นมั้ย (เช็คหลายเงื่อนไขก็ใช้เป็นอาเรย์)- thing คือ object ที่ใช้เพื่อเช็คความเป็นเจ้าของ- options จะใช้กรณีที่ต้องการเช็คทั้งหมดหรือการเปลี่ยนชื่อ foreign key ที่ใช้เช็คนี่คือตัวอย่างการใช้งานทั้ง 2 method$post = Post::find(1);$user->canAndOwns('edit-post', $post);$user->canAndOwns(['edit-post', 'delete-post'], $post);$user->canAndOwns(['edit-post', 'delete-post'], $post, ['requireAll' => false, 'foreignKeyName' => 'writer_id']); $user->hasRoleAndOwns('admin', $post);$user->hasRoleAndOwns(['admin', 'writer'], $post);$user->hasRoleAndOwns(['admin', 'writer'], $post, ['requireAll' => false, 'foreignKeyName' => 'writer_id']);คลาสของ Laratrust มีทางลัดที่จะใช้กับ method อย่าง owns(), canAndOwns และ hasRoleAndOwns เพื่อเช็คกับผู้ใช้ที่เข้าใช้งานอยู่ตอนนี้ได้Laratrust::owns($post);Laratrust::owns($post, 'idUser');Laratrust::canAndOwns('edit-post', $post);Laratrust::canAndOwns(['edit-post', 'delete-post'], $post, ['requireAll' => false, 'foreignKeyName' => 'writer_id']);Laratrust::hasRoleAndOwns('admin', $post);Laratrust::hasRoleAndOwns(['admin', 'writer'], $post, ['requireAll' => false, 'foreignKeyName' => 'writer_id']);Teamsสำหรับวิธีการกำหนด Roles และการลบ Roles ของแบบ team ก็ใช้ method เดียวกับของ user เลยครับ แต่เราต้องระบุพารามิเตอร์สำหรับของ team เพิ่มเข้าไปด้วย$team = Team::where('name', 'my-awesome-team')->first();$admin = Role::where('name', 'admin')->first(); $owner = Role::where('name', 'owner')->first(); $user->attachRole($admin, $team); //กำหนดทีละ Role $user->attachRole([$admin, $owner], $team); //กำหนดแบบหลาย Role // พารามิเตอร์สามารถใส่เป็น object, array หรือชื่อ Role เลยก็ได้จากตัวอย่างด้านบน เป็นการตั้งให้ user เป็น admin แต่อยู่เฉพาะในทีม "my-awesome-team" เท่านั้น (เราสามารถตั้งให้ user เป็นได้หลาย role โดยการใส่พารามิเตอร์ role แบบอาเรย์)การลบ role สามารถทำได้โดยใช้ method ที่ว่า detachRole สำหรับลบทีละ Role และ detachRoles สำหรับหลายลบที่เดียวหลาย Role$user->detachRole($admin, $team); $user->detachRoles([$admin, $owner], $team); // พารามิเตอร์สามารถใส่เป็น object, array หรือชื่อ Role เลยก็ได้และเราสามารถซิงค์ Roles ภายในทีมได้ด้วย$user->syncRoles([$admin, $owner], $team);เพิ่มและลบ Permission ภายในทีมในทีมเช่นเดียวกับการให้สิทธิ์และลบของ User แค่เพิ่มพารามิเตอร์ระบุว่าเป็นทีมอะไรเข้าไป$team = Team::where('name', 'my-awesome-team')->first();$editUser = Permission::where('name', 'edit-user')->first(); $user->attachPermission([$editUser], $team); //สามารถใส่ได้หลายสิทธิ์โดยการระบุเป็นอาเรย์การลบ Permission ภายทีม$user->detachPermission($editUser, $team); //ลบทีละสิทธิ์$user->detachPermissions([$editUser, $manageUsers], $team); //ลบหลายสิทธิ์ทีเดียวการซิงค์ Permission ภายในทีม$user->syncPermissions([$editUser, $manageUsers], $team);เช็ค Role ในทีม$user->hasRole('admin', 'my-awesome-team');$user->hasRole(['admin', 'user'], 'my-awesome-team', true);เช็ค Permission ในทีม$user->can('edit-user', 'my-awesome-team');$user->can(['edit-user', 'manage-users'], 'my-awesome-team', true);เช็คความสามารถของ user ในทีม$options = [    'requireAll' => true | false (Default: false),    'foreignKeyName'  => 'canBeAnyString' (Default: null)]; $user->ability(['admin'], ['edit-user'], 'my-awesome-team');$user->ability(['admin'], ['edit-user'], 'my-awesome-team', $options);เช็ค Permission, Roles และ ความเป็นเจ้าของในทีม$options = [    'team' => 'my-awesome-team',    'requireAll' => false,    'foreignKeyName' => 'writer_id']; $post = Post::find(1);$user->canAndOwns(['edit-post', 'delete-post'], $post, $options);$user->hasRoleAndOwns(['admin', 'writer'], $post, $options);ใช้งาน Middlewareเราสามารถใช้ middleware ในการกรอง route เดี่ยว และกลุ่มของ route ด้วย permission, roles หรือ ability มาดูตัวอย่างกันเลยRoute::group(['prefix' => 'admin', 'middleware' => ['role:admin']], function() {    Route::get('/', '[email protected]');    Route::get('/manage', ['middleware' => ['permission:manage-admins'], 'uses' => '[email protected]']);});การใช้ | เพื่อระบุว่าเป็นอย่างใดอย่างหนึ่ง'middleware' => ['role:admin|root']// $user->hasRole(['admin', 'root']); 'middleware' => ['permission:edit-post|edit-user']// $user->hasRole(['edit-post', 'edit-user']);ต้องการให้ตรงทุกเงื่อนไขโดยเพิ่ม require_all 'middleware' => ['role:owner|writer,require_all']// $user->hasRole(['owner', 'writer'], true); 'middleware' => ['permission:edit-post|edit-user,require_all']// $user->can(['edit-post', 'edit-user'], true);หรือถ้าต้องการเช็คแบบซับซ้อนให้ใช้ ability โดยมาระบุค่า 3 พารามิเตอร์ได้แก่ roles, permissions และ options'middleware' => ['ability:admin|owner,create-post|edit-user,require_all']// $user->ability(['admin', 'owner'], ['create-post', 'edit-user'], true)ถ้าต้องการให้ middleware เช็คสำหรับภายในทีม 'middleware' => ['role:admin|root,my-awesome-team,require_all']// $user->hasRole(['admin', 'root'], 'my-awesome-team', true); 'middleware' => ['permission:edit-post|edit-user,my-awesome-team,require_all']// $user->hasRole(['edit-post', 'edit-user'], 'my-awesome-team', true); 'middleware' => ['ability:admin|owner,create-post|edit-user,my-awesome-team,require_all']// $user->ability(['admin', 'owner'], ['create-post', 'edit-user'], 'my-awesome-team', true); การ return ค่าของ Middlewareเราสามารถตั้งค่าที่ไฟล์ config/laratrust.php ซึ่งจะมีก 2 ประเภทคือAbort  คือจะ return เป็น code 403 (ค่าเริ่มต้น)Redirect ให้ไปที่หน้าอื่น เราสามารถตั้งค่าหน้าที่จะให้ redirect ไปด้วยการตั้งค่า'middleware_handling' => 'redirect','middleware_params'   => '/home',       // เปลี่ยนเป็น route ที่ต้องการได้เลยSoft Deletingสำหรับวิธีการที่เราจะลบ Role ออกนั้น แนะนำว่าไม่ควรลบแบบถาวร forceDelete() เลยทันทีนะ เพราะว่า role นั้นหายไปก็จริง แต่ข้อมูล Permission ที่เกี่ยวข้องกับ role นั้น และ user ที่มี role นั้นยังคงอยู่ และไม่เป็นเรื่องดีแน่ถ้ามีการเรียกใช้ข้อมูลจาก permission หรือ user ขึ้นมาแล้วปรากฎว่า role นั้นหายไปแล้ว มันก็จะ error และอีกอย่างข้อมูลขยะใน database ก็จะเยอะด้วยดังนั้นควรจะเราแบบปกติก่อน แล้วตามลบข้อมูลที่สัมพันธ์กัน จากนั้นถึงลบถาวรได้ ตามตัวอย่างนี้ครับ$role = Role::findOrFail(1); // ลบแบบปกติ$role->delete(); // ลบทุกข้อมูลที่สัมพันธ์กัน$role->users()->sync([]);$role->permissions()->sync([]); // ลบแบบถาวร$role->forceDelete();ตัวอย่างการใช้งานใน Blade Templatesการใช้งานจะเหมือนกันเราใช้ @if แต่เขียนในแบบย่อ เช่น ถ้าต้องการให้แสดงเฉพาะคนที่มี role ที่กำหนด@role('admin')[email protected] ถ้าต้องการให้แสดงเฉพาะคนที่มี permission ที่กำหนด @permission('manage-admins')[email protected] ถ้าต้องการให้แสดงเฉพาะคนที่มีความสามารถตามเงื่อนไข @ability('admin,owner', 'create-post,edit-user')[email protected] ถ้าต้องการให้แสดงเฉพาะคนที่มี permission ที่กำหนด และเป็นเจ้าของ object นั้นด้วย @canAndOwns('edit-post', $post)[email protected] ถ้าต้องการให้แสดงเฉพาะคนที่มี role ที่กำหนด และเป็นเจ้าของ object นั้นด้วย @hasRoleAndOwns('admin', $post)[email protected]และนี่ก็คือทั้งหมดของแพคเกจ Laratrust ครับ เป็นบทความที่ยาวที่สุดเคยเขียนมา อาจมีการเรียบเรียงบกพร่องไปบ้าง แต่จะพยายามปรับปรุงให้กระชับอ่านง่ายขึ้นนะครับ หากผิดพลาดก็ขออภัย หากถูกใจก็ขอขอบคุณนะครับ :)

  • การติดตั้ง Laratrust ตัวจัดการเรื่องสิทธิ์การใช้งาน (ACL)

    Article
    Save Pongsiri 6 months ago

    Laratrust เป็นแพคเกจสำหรับ Laravel 5 ที่ช่วยให้เราจัดการเรื่องสิทธิ์การใช้งานแบบ ACL โดยเราสามารถกำหนด Role, Permission และ Team เพื่อจัดการการเข้าถึงได้อย่างยืดหยุ่น ติดตั้ง Laratrust Package1. รันคำสั่ง composer require ในโปรเจค Laravel ของเรา ด้วย Terminalcomposer require "santigarcor/laratrust:5.0.*"(สำหรับใครที่ใช้ Laravel 5.5 ขึ้นไป ข้ามไปข้อ 4 ได้เลยครับ)2. เข้าไปเพิ่ม LaratrustServiceProvider ที่อาเรย์ providers ในไฟล์ config/app.phpLaratrust\LaratrustServiceProvider::class,3. และเพิ่ม Laratrust ที่อาเรย์ aliases ด้านล่างของไฟล์ด้วยนะ 'Laratrust'   => Laratrust\LaratrustFacade::class,           4. รันคำสั่งเปิดใช้ไฟล์ config ของ laratrust ทั้งหมดครับphp artisan vendor:publish --tag="laratrust"(ถ้าหากรันคำสั่งด้านบนแล้วไม่มีอะไรตอบสนอง ให้เคลียแคช config ของเราก่อนครับ)php artisan config:clearตั้งค่าในไฟล์ Configตอนนี้เราจะได้ไฟล์ config/laratrust.php สำหรับตั้งค่าต่าง ๆ ของ laratrust ดังนี้ถ้าต้องการสร้างสิทธิ์ผู้ใช้แบบทีมก็ให้เปิดใช้ฟีเจอร์นี้ตรงบรรทัดนี้use_teams => trueปกติ Laratrust จะเซ็ตโมเดล User เป็นโมเดลหลักอันเดียว กรณีมีหลาย User โมเดลก็เพิ่มอาเรย์เป็นชื่อโมเดลต่อลงไปได้เลย'user_models' => [    'users' => 'App\User',     ...],ตอนเรียกใช้ก็เรียก method ตาม key ที่เราตั้งแบบนี้$role->users;$role->users();ติดตั้งแบบอัตโนมัติ (แนะนำ)เมื่อ Config เสร็จแล้ว ต่อจากนี้ก็จะเป็นขึ้นการของติดตั้งเข้าโปรเจคของเรา ถ้าต้องการให้ Laratrust ทำการติดตั้งตัวเองอัตโนมัติ ก็แค่รันคำสั่งนี้ครับphp artisan laratrust:setupคำสั่งนี้ก็จะ Generate ไฟล์ model และ migration มาให้ครับ (ถ้าเปิดใช้ฟีเจอร์ทีมก็จะมีโมเดล Team มาให้ด้วย) และอย่าลืม dump-autoload ใหม่ด้วยนะcomposer dump-autoloadสร้าง Migrationโดยใช้คำสั่งสร้าง migration ของ laratrust ตามนี้ครับphp artisan laratrust:migrationจะได้ไฟล์ ชื่อ แล้วเราก็รันคำสั่ง migrate ได้เลยphp artisan migrateเสร็จแล้วเราจะได้ตารางในฐานข้อมูลเพิ่มขึ้นตามนี้- roles                           ไว้เก็บชื่อ role เช่น admin, user- permissions                ไว้เก็บชื่อ permission- teams                         ไว้เก็บชื่อ team (ถ้าต้ังค่า use_teams = true)- role_user                    ไว้ความสัมพันธ์ของตาราง roles และ users- permission_role          ไว้เก็บความสัมพันธ์ Many to Many ของ roles กับ permissions- permission_user         ไว้เก็บความสัมพันธ์ของตาราง users กับ permissionsสร้างโมเดล Roleตอนนี้เราก็จะไล่สร้าง Model ที่เราจำเป็นต้องไว้ครับเริ่มจากสร้างไฟล์โมเดลใหม่ในโฟลเดอร์ app ตั้งชื่อว่า app/Role.php แล้วเขียนโค้ดตามนี้namespace  App;use Laratrust\Models\LaratrustRole; class Role extends LaratrustRole{ }สำหรับโมเดล Role จะมีแอททริบิวต์หลักมาให้ 3 แอททริบิวต์- name                ชื่อที่ใช้เรียก Role แบบไม่ซ้ำกัน เช่น "admin", "owner", "employee"- display_name   ชื่อ Role แบบแสดงให้คนอ่าน เช่น User "Administrator", "Employee"- description        รายละเอียดของแต่ละ Role (ค่าเริ่มต้นเป็น null)สร้างโมเดล Permissionในโฟลเดอร์ app ให้สร้างไฟล์อีกไฟล์นึงชื่อ Permission.php แล้วเขียนโค้ดตามนี้namespace App;use Laratrust\Models\LaratrustPermission; class Permission extends LaratrustPermission{ }สำหรับโมเดล Permission จะมีแอททริบิวต์หลักมาให้ 3 แอททริบิวต์ เช่นกัน- name                ชื่อที่ใช้เรียก Permission แบบไม่ซ้ำกัน เช่น "create-post"- display_name   ชื่อ Permission แบบแสดงให้คนอ่าน เช่น User "Create Posts"- description        รายละเอียดของแต่ละ Permission (ค่าเริ่มต้นเป็น null)สร้างโมเดล Team (ถ้าเปิดใช้งาน)ในโฟลเดอร์ app ให้สร้างไฟล์ชื่อ Team.php แล้วเขียนโค้ดตามนี้namespace App;use Laratrust\Models\LaratrustTeam; class Team extends LaratrustTeam{ }สำหรับโมเดล Team จะมีแอททริบิวต์หลักมาให้ 3 แอททริบิวต์- name                ชื่อที่ใช้เรียก Team แบบไม่ซ้ำกัน เช่น "my-team"- display_name   ชื่อ Team แบบแสดงให้คนอ่าน เช่น User "My Team"- description        รายละเอียดของแต่ละ Team (ค่าเริ่มต้นเป็น null)ตั้งค่าในโมเดล Userตรงนี้เราจะมีโมเดล User อยู่แล้ว ให้เราเข้าไปเพิ่ม LaratrustUserTrait ในไฟล์ app/User.php ตามตัวอย่างนี้use Laratrust\Traits\LaratrustUserTrait; class User extends Model{   use LaratrustUserTrait; // เรียกใช้ trait   ...}เราก็จะสามารถใช้ความสัมพันธ์ของ Role และ Permission ด้วย method เหล่านี้ roles(), hasRole($name), hasPermission($permission), isAbleTo($permission), can($permission), ability($roles, $permissions, $options) และ rolesTeams()ที่สำคัญอย่าลืม dump autoload ใหม่ด้วยcomposer dump-autoloadสร้าง Seederมาถึงนี้เราก็มีโครงสร้างพร้อมใช้งานแล้วแหละ แต่ขาดข้อมูลเริ่มต้นชื่อ Role, Permission ที่เราจะมีไว้ใช้ก่อนนั่นเอง โดยการรันคำสั่งสร้าง seeder ของ laratrust php artisan laratrust:seederและเช่นเคยcomposer dump-autoloadเสร็จแล้วก็ไปเพิ่มคำสั่งสำหรับรัน method ในไฟล์ database/seeds/DatabaseSeeder.php$this->call(LaratrustSeeder::class);(** ถ้าเราไม่ได้รันคำสั่ง php artisan vendor:publish --tag="laratrust" ตั้งแต่แรก เราต้องจัดการ roles, modules และ permissions เองแต่ละอันครับ)ตอนนี้ในไฟล์ config/laratrust_seeder.php จะมีหน้าแบบนี้return [    'role_structure' => [        'superadministrator' => [            'users' => 'c,r,u,d',            'acl' => 'c,r,u,d',            'profile' => 'r,u'        ],        'administrator' => [            'users' => 'c,r,u,d',            'profile' => 'r,u'        ],        'user' => [             'profile' => 'r,u'        ],    ],    'permission_structure' => [        'cru_user' => [            'profile' => 'c,r,u'        ],    ],    ...];ทำความเข้าใจกับ role_structure ในอาเรย์ด้านบนนี้- ชั้นบนสุดคือชื่อ Role- ชั้นรองลงมาคือโมดูลสำหรับใช้งานแต่ละส่วน- ในแต่ละโมดูลจะมีการระบุชื่อ permission ที่อนุญาตแบบย่อสั้น ๆส่วนใน permission_structure คือ- ชั้นบนสุดคือชื่อ users- ชั้นรองลงมาคือโมดูลสำหรับใช้งานแต่ละส่วน- ในแต่ละโมดูลจะมีการระบุชื่อ permission ที่อนุญาตแบบย่อสั้น ๆถ้าต้องการใช้คำย่ออื่นที่ไม่ใช่ c, r, u, d ตามที่มีมาให้ ก็ให้เข้าไปปรับเองที่ config/laratrust_seeder.php ตรงอาเรย์ permission_map ครับติดตั้งตัวจัดการ Team (ถ้าเปิดใช้)1. ตั้งค่า use_teams เป็น true ในไฟล์ config/laratrust.php2. รันคำสั่งติดตั้งphp artisan laratrust:setup-teams3. รัน migratephp artisan migrateสำหรับใครอ่านที่ถึงตรงนี้แล้ว ยินดีด้วยครับการติดตั้ง Laratrust ของคุณเสร็จเรียบร้อยแล้ว เย้ๆๆ แต่นี่เป็นแค่ครึ่งทางเท่านั้น เพราะอีกครึ่งทางที่เหลือคือการใช้งาน Laratrust ซึ่งมี method ให้ใช้ได้หลายอย่างมาก รวมทั้งตัวอย่างการใช้งานในกรณีต่างๆ อีกเพียบดังนั้นจึงขอแยกเป็นเรื่อง ๆ เพื่อให้ง่ายในการกลับมาดูอีกครั้งนึง และบล็อคนี้ได้ไม่ยาวเกินไปด้วยแหละ เอาหล่ะไปพักสายตาแปป แล้วเจอกันนะครับ :)

  • วิธีเข้ารหัส URL ที่มีภาษาไทยหรืออักขระพิเศษ

    Topic
    Save Pongsiri 6 months ago

    ใช้ฟังก์ชั่นที่มีให้อยู่แล้วของแต่ละภาษาที่เขียนได้เลยครับJavaScript ใช้ฟังก์ชั่น encodeURI()PHP ใช้ฟังก์ชั่น rawurlencode()ASP ให้ฟังก์ชั่น URLEncode()