พอจะมีวิธีส่งค่าตัวแปรในฟังก์ชั่นไปยังตัวแปร local ภายใน class ไหมครับ
ใส่ highlight เป็นไหม?
ปกติส่งค่าภายใน class ก็ใช้ property ก็ถูกแล้ว
Code (PHP)
class MyClass
{
protected $var1;
public function run()
{
$this->var1 = 'abc';
$this->showResult();
}
public function showResult()
{
echo $this->var1;// จะได้ abc
}
}
ถ้ามันไม่ได้ก็ต้องดูตอนกำหนดค่าให้ property ว่ามันได้กำหนดค่าอะไรหรือเปล่า ทดลอง var_dump ออกมาดู
Date :
2020-04-20 18:55:04
By :
mr.v
Code (PHP)
class MyClass {
private $myvar; // ประกาศตัวแปรภายใน class
public function __construct(){ // function พิเศษ เมื่อ class ถูกสร้าง จาก คำสั่ง $var = new myClass
parent::__construct();
$this->myvar='จะกำหนดอะไรก็ว่าไปในนี้';
// จริงๆ แล้ว ทุก function ก็สามารถกำหนดค่าให้กับตัวแปร ได้เหมือนกันหมด
}
}
Date :
2020-04-20 19:41:51
By :
Chaidhanan
ขอความกรุณาอีกนิดครับ ผมติดตรงที่อยากให้ตัวแปรมันมีค่าและใช้ ภายใน classs ครับ
Code (PHP)
class MyClass {
private $myvar; // ประกาศตัวแปรภายใน class
public function __construct(){ // function พิเศษ เมื่อ class ถูกสร้าง จาก คำสั่ง $var = new myClass
parent::__construct();
$this->myvar='จะกำหนดอะไรก็ว่าไปในนี้';
// จริงๆ แล้ว ทุก function ก็สามารถกำหนดค่าให้กับตัวแปร ได้เหมือนกันหมด
}
pub function First(Request &request){
$blog = $request->title; //รับค่ามาจากฟอร์ม
$this->myvar=$blog //ตรงนี้คือสิ่งที่ผมอยากทำหนดค่าให้ตัวแปร เพื่อให้ฟังก์ชั่น Second
// session(['blogId' => $blog]); ถ้าส่งโดยใช้ตัวแปร session มันได้ผลแต่มันสามารถเข้าถึงตัวแปรนี้ได้ทุกที่ ผมต้องกมารใช้แค่ใน class นี้
}
pub function Second (Request $request){ ///ฟังก์ชั่นนี้รับค่าจากฟอร์มรูปภาพซึ่งถูกส่งมาเป็น ajax ผมใช้ dropzone
$file = $request->file('file'); //ผมรับไฟล์ภาพมา
dd($this->$myvar) ผมดั้มค่ามาดูมันกลับเป็นค่า null ว่างป่าว
}
}
Date :
2020-04-20 21:13:45
By :
kot
ผมไม่เคยเขียนแบบนี้ งง ภาษา php หรือเปล่า
pub function First(Request &request){
Date :
2020-04-20 22:27:21
By :
Chaidhanan
var_dump ที่ตัว $blog ตรงตัวที่กำหนดค่าให้ property ครับไม่ใช่ตัวอ่าน
จะหาเหตุต้องหาให้ตรงจุด ไปหาตรงที่อ่านมันตรงจุดที่ไหนกัน?
$this->blogId= $blog // เอาไว้ทีหลัง
var_dump($blog);
exit();
ประวัติการแก้ไข 2020-04-20 22:41:05
Date :
2020-04-20 22:38:54
By :
mr.v
ค่ามันมาจากฟอร์มจริงแต่มันผ่าน function create(); ดังนั้นต้อง var_dump ให้เห็นแน่ๆ
และก็ต้องย้อนกลับไปดูที่การเรียกใช้ method image()
ถ้าไม่ได้เรียกใช้ต่อเนื่องอันเดียวกัน มันก็กลายเป็น null อยู่ดี เช่น
Code (PHP)
$Class = new HomeController();
$Class->Create();
$HomeController = new HomeController();
$HomeController->image();
แบบนี้มันก็ไม่ได้ มันไม่ได้ใช้ตัวแปรจาก object ที่ถูกสร้างในทีแรก
การเรียกใช้ image ต้องเป็นไปในลักษณะส่งต่อกัน เช่น
Code (PHP)
$Class = new HomeController();
$Class->Create();
$Class->image();
หรือ
Code (PHP)
class HomeController
{
public function Create()
{
$this->image();
}
public function image()
{
//...
}
}
ประวัติการแก้ไข 2020-04-20 23:31:42 2020-04-20 23:36:59 2020-04-21 00:34:15
Date :
2020-04-20 23:29:54
By :
mr.v
- $this->middleware('auth'); เนี่ยถ้าจะให้ดีให้มันไปเรียกใน web.php หรือ Route Group มันจะดีกว่าเพราะถ้าเขียนแบบ construct มันต้องไปเพิ่มทุกหน้า และถ้ามีการแก้ก็ต้องไล่แก้ทุก file ซึ่งมันเสียเวลา แก้หน้า route ทีเดียวจบเพื่อประหยัดเวลา
Code (PHP)
Route::group(['middleware' => ['web']], function () {
//
});
- ส่วนรูปแบบการ insert ลองไปหาข้อมูลการใช้ tinger มันสะดวกไม่ต้องใช้ fillable model
Code (PHP)
$register=new Register();
$register->name=$request->name;
$register->email="$request->email;
$register->save();
- เทคนิค call function No.10 ตัวอย่างที่ 3 อันนี้ชัดเจน
ประวัติการแก้ไข 2020-04-21 10:01:19
Date :
2020-04-21 09:59:24
By :
Genesis™
ตอบความคิดเห็นที่ : 10 เขียนโดย : mr.v เมื่อวันที่ 2020-04-20 23:29:54
รายละเอียดของการตอบ ::
ขอขอบคุณทุกท่านมากนะครับ ทั้ง พี่Genesis™ , พี่ mr.v และพี่ Chaidhanan ที่พยายมช่วยผมครับ ผมได้วิธีแก้ละครับ
เริ่มจากฝั่ง Controller ก่อนนะครับ วิธีแก้คือ ผม Return ค่ากลับไป โดย สร้าง hidden ในฟอร์มรับค่าไว้ id จาก function uploadSubmit
Code (PHP)
public function uploadSubmit(Request $request)
{
$blog = auth()->user()->blog()->create($request->all());
$blog_id = $blog->id;
return response()->json(['success'=>'Added new records.','blog_id'=>$blog_id]);
}
public function images(Request $request){
if ($request->hasfile('file')) {
$file = $request->file('file');
$i=1;
$blogid = $request->blogid;
foreach ($file as $photo) {
// $title = $blog->title;
$date = now()->format('Y-m-d');
$filename = 'photo-'.$i . '.' .$photo->getClientOriginalExtension();
$paths[] = $photo->storeAs('blog_images'.'/'.$date, $filename, 'public');
$i++;
}
foreach ($paths as $images) {
BlogsPhoto::create([
'blog_id' => $blogid,
'filename' => $images
]);
}
}
}
ต่อไปฝั่ง Form รับค่าครับ
Code
{!! Form::hidden('blogid', '',['class'=>'blogid','id'=>'blogid']) !!} // ค่าที่ blog_id ที่ return มาจาก controller***********
แล้วรับด้วย javascript ของ dropzone ซึ่งเป็น drag and drop file ครับ
Code (JavaScript)
Dropzone.autoDiscover = false;
var myDropzone = new Dropzone("#dropzone", {
url: '{{ route('home.images') }}',
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
},
method: "POST",
paramName: "file",
autoProcessQueue : false,
acceptedFiles: "image/*",
maxFiles: 5,
maxFilesize: 5, // MB
uploadMultiple: true,
parallelUploads: 100, // use it with uploadMultiple
createImageThumbnails: true,
thumbnailWidth: 120,
thumbnailHeight: 120,
addRemoveLinks: true,
timeout: 180000,
});
myDropzone.on("sending", function(file, xhr, formData) {
formData.append("blogid", $("#blogid").val());
});
// on success
myDropzone.on("successmultiple", function(file, response) {
myDropzone.removeAllFiles(file);
$("#dropzone-form")[0].reset();
});
var submitDropzone = document.getElementById("submit-dropzone");
submitDropzone.addEventListener("click", function(e) {
e.preventDefault();
e.stopPropagation();
formData = $('#dropzone-form').serialize();
//Check value validation dropzone file
var file = "";
if (myDropzone.getQueuedFiles().length > 0) {
file = myDropzone.getQueuedFiles().length;
}
$.ajax({
url: '{{ route('home.uploadSubmit') }}',
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
},
type:'POST',
data: formData,
success: function(data) {
if($.isEmptyObject(data.error)){
var blogid = data.blog_id;
$("#blogid").val(blogid); // ตัวนี้ส่งไปยัง function image ใน controller เพื่อให้ เพิ่มลง data base ครับ ******
console.log(blogid);
myDropzone.processQueue();
alert(data.success);
}else{
console.log(blogid);
printErrorMsg(data.error);
}
}
});
function printErrorMsg (msg) {
$(".print-error-msg").find("ul").html('');
$(".print-error-msg").css('display','block');
$.each( msg, function( key, value ) {
$(".print-error-msg").find("ul").append('<li>'+value+'</li>');
});
}
});
เหนื่อยเลยครับ แต่ดีใจที่ได้ ผมไม่อยากใช้ตัวแปร session เพราะมัน เรียกได้ทุกที่
Date :
2020-04-21 21:37:11
By :
zeuszerome
ขอทราบเหตุผลหน่อยครับ ว่าทำไมถีงไม่อยากใช้ session
ถีงแม้ session จะสามารถเรียกใช้ได้ทุกที่ในโปรแกรม
แต่มันจำกัดการเรียกใช้ได้เฉพาะ client ที่ติดต่อเข้ามาเท่านั้น
Date :
2020-04-22 06:39:58
By :
Chaidhanan
ไม่ต้องส่งกลับไปกลับมาก็ได้ครับ
ศึกษาหัวข้อ Dependency Injection & Controller จาก Document ซึ่งทำได้ทั้งใน Contructor และ/หรือ Method
ส่วน Routing ก็สำคัญ เช่นกัน
Date :
2020-04-22 13:50:00
By :
PhrayaDev
Load balance : Server 00